Обсуждение статьи тематического каталога: От C к Ассемблеру (gcc assembler)Ссылка на текст статьи: https://www.opennet.ru/base/dev/from_c_to_asm.txt.html
Rules !!!
я так смотрел - да вроде неплохо !
,но не стоит так уж жeстко писать и использовать asm где попало !!!
Учитывая всякие исключения, прерывания и schedule of procceses нужно изьавляться от этого всего.
Жаль root не всемогущ (относительно asm instruction)/*если не так то напишите - может я чего не еще не узнал*/для таких замеров самая рульная ось - MS-DOS или unix-подобные но {как я сделал дописал kernel и ВСУНУЛ ТУДА read 64-bit TSC/* это когда я оптимизировал string.h */}
By !!!
феноменально! листинги 11 и 12 раздвигают рамки понятия "идиотский" до невообразимых пределов. это надо было додуматься сделать двойной цикл там где можно обойтись 2 вычитаниями и одним сдвигом.
Уважаемый кирогазов,
Вы, как и многие, путаете цели и путаетесь в необходимых для них средствах.Цель статьи — введение в ассемблерные вставки, а не обучение достижению оптимального кода.
Учебный пример ставит своей задачей демонстрацию каких-то элементарных особенностей обсуждаемого инструментария, а не создание самого быстрого кода на Земле, при этом малопонятного даже продвинутым.
Впрочем, лет через 20 юношеский максимализм и снобизм, который свойственен тем, кто сам только позавчера что-то узнал и уже с высока поглядывет на остальных, пройдёт...
Отличная статья.
Вот два моих примера по-копированию строки, работает как обычная
Си-библиотечная функция strcpy, только работает на 15%-быстрее, тестировал функцией WinAPI: QueryPerformanceCounter которая не участвует в планирование и время не считает при переключений контекстов, но windows система не реального времени точных результатов всё равно не получить, ну хоть приблизительно.
//На синтаксисе AT&T компилятор GCC.#include <stdio.h>
char* _strcpy(char* _s, const char* _d) {
char* t = _s;
asm("movl %0, %%esi"::"d"(_d));
asm("movl %0, %%edi"::"d"(_s));
asm("n:");
asm("mov (%esi), %al");
asm("mov %al, (%edi)");
asm("or $0, %al");
asm("jz e;");
asm("incl %esi");
asm("incl %edi");
asm("jmp n;");
asm("e:");
return t;
}
int main(void) {
char s[64];
_strcpy(s, "Hello GCC from syntaxis AT&T");
puts(s);
return 0;
}
***********************************************************************
//На синтаксисе INTEL компилятор Borland C.#include <stdio.h>
char* _strcpy(char* _s, const char* _d) {
char* t = _s;
__asm {
mov esi, _d
mov edi, _s
n:
mov al, [esi]
mov [edi], al
or al, 0
jz e;
inc esi
inc edi
jmp n;
e:
};
return t;
}
int main(void) {
char s[64];
_strcpy(s, "Hello Borland C from syntaxis INTEL");
puts(s);
return 0;
}