Я пользуюсь Dev-C++ компилятором. Как делать asm вставки в этой среде разработки? Или может есть какие нибудь маны на русском? подскажите пожалуйсто.
Вот пример вставки, которая равносильна сишному return ( (!x) ? 0 : (scale * log10(x)) ); Код (Text): int rescale(int x){ asm( "test %%eax,%%eax\n\t" "pushl %%eax\n\t" "jz rescale_R\n\t" "fldlg2\n\t" "fildl (%%esp)\n\t" "fyl2x\n\t" "fldl (_scale)\n\t" "fmulp %%st,%%st(1)\n\t" "fistpl (%%esp)\n\t" "rescale_R:\n\t" "popl %%eax" : "=a" (x) : "a" (x) ); return x; } Более подробно о синтаксисе асма AT&T и оформлении вставок можно почитать в манах GCC. Ссылку на конкретный топик можно найти в факе.
Используя Dev-C++ решил протестить асм вставки, написал простенький до ужаса кодес: Код (Text): #include <cstdio> #include <cstdlib> using namespace std; int main(int argc, char* argv[]) { cout << "asm vstavki\n"; asm("mov %eax, 10") ; asm("add %eax, 15") ; system("PAUSE"); return 0; } компилится отлично, но вот запускаеш .exe файл скомпилированной проги, как винда выкидывает "недопустимую ошибку и окно будет закрыто, хотите отправить отчет?" в чем проблема?
dj0nik Код (Text): #include <cstdio> #include <cstdlib> int main() { printf("test\n"); asm("movl $10, %eax\n\t" "addl $15, %eax\n\t"); return 0; } Все таки пренебрегать этим не надо.
в Intel-нотации это будет так: Код (Text): mov dword ptr [10], eax add dword ptr [15], eax Результаты ясны
В AT&T-нотации обратный интеловскому порядок следования операндов: Intel: Код (Text): mov eax,10 add eax,15 AT&T: Код (Text): movl $10,%eax addl $15,%eax
асмовых вставок рекомендуется избежать ввиду плохой переносимости между средами разработки. разумеется если речь идет о реальных проектах.