Добрый вечер Сейчас практикуюсь в написании программ =).. различных и интересных. И чтоб расти над собой, решил совместить программирование на СИ и АСМЕ... делать в коде ассемблерные вставки..(да и не авось какие..а качественные..) Ну и вот, так как я использую только *nix системы, и программирую соответственно только под них. Попробовал написать простенькую ассемблерную вставку в язык си.. и откомпилировать через GCC. Ничего не получилось... Затем, зашел на ресурс линекс асм....... ии...разочарование..., особо не разобрался.. (не знаю английского языка). Потом просмотрел литературу на русском языке.. где рассказывается о программировании на СИ с Асм вставками в GCC. Разобрался =).. всё достаточно качественно и интересно.. но есть одно НО. или даже ДВА НО. inline-ассемблер в gcc достаточно хорошо сделан, как я понимаю для быстродействия...это очень даже хорошо =).. показывать коду на СИ...какие регистры будут задействованы... где хранить операнды...в памяти или в регистрах (лучше конечно же в eax) но блин... AT&T Синтаксис, конечно хорошо.. но очень не привычен... и не всегда понятен с полу взгляда ( asm("movl %1, %%eax; movl %%eax, %0;" :"=r" (b) //выходной параметр :"r" (a) // входной параметр : "%eax" )) Как сделать так, чтоб можно было делать асм вставки в код на си..в интеловской нотации ?(под gcc)
Никак, пока ты используешь gcc и gnu as. Попробуй другой асемблер - fasm, nasm... Если они выплюнут нормальный .o файл - то всё будет пучком.
s0larian Никогда не использовал as =) На асме, программы компилировал всегда через nasm. А тут, прям в коде на языке СИ , нужно асм вставку сделать =)... знаю, как это сделать в AT&T , и на мой взгляд, это слегка не удобно (.. хочу такие вставки делать в интеловской нотации.......... и вот вопрос) как это сделать?... может можно по отдельности ..написать код на асме.и на си...потом переделать в объектные файлы.. .о и затем их както соеденить? ) (ниразу так не делал...)........................как это сделать?
Код (Text): asm(".intel_syntax noprefix"); asm("xor eax, eax"); Только еще с опцией -mintel-syntax Правда, это для MinGW работало...
stellaco, асм вставки в gcc идут в той же нотации что принимает gnu as (из binutils), т.к. этот компилер выплёвывает асм и скармливает его ассемблеру. То есть, gcc "компилирует в асм". Поэтому, если хочешь intel systax, компиль отдельный файл в nasm/fasm/итд, и линкуй к своему коду.
ИМХО, стоит бросить заниматься ерундой и перейти на винду... В плане программирования здесь все гораздо лучше
+1 не совсем по сабжу... но все же iretd в AT&T синтаксисе как будет? хм... плохо искал... http://www.wasm.ru/forum/viewtopic.php?id=24940
Всё верно,вот такой код у меня работает и в MinGW`e и в никсах(фряха) Код (Text): #include <stdio.h> int xasm = 0; int main() { //int xasm = 0; __asm(".intel_syntax noprefix\n"); __asm("mov eax, 5\n"); __asm("shl eax, 4\n"); __asm("mov _xasm, eax\n"); printf( "%X\n", xasm ); return 0; }
Ещё один вопрос. Как воспринимает следующее __asm("mov eax, 5"); компилятор GCC, как функцию? или мнемонику? надеюсь при компиляции этого кода, Не создаётся что-то наподобии push ebp mov ebp, esp ?