gcc + asm вставки... синтаксис intel ??

Тема в разделе "WASM.BEGINNERS", создана пользователем stellaco, 19 янв 2009.

  1. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Добрый вечер
    Сейчас практикуюсь в написании программ =).. различных и интересных.
    И чтоб расти над собой, решил совместить программирование на СИ и АСМЕ... делать в коде ассемблерные вставки..(да и не авось какие..а качественные..)
    Ну и вот, так как я использую только *nix системы, и программирую соответственно только под них. Попробовал написать простенькую ассемблерную вставку в язык си.. и откомпилировать через GCC. Ничего не получилось... Затем, зашел на ресурс линекс асм....... ии...разочарование..., особо не разобрался.. (не знаю английского языка).
    Потом просмотрел литературу на русском языке.. где рассказывается о программировании на СИ с Асм вставками в GCC.
    Разобрался =).. всё достаточно качественно и интересно..
    но есть одно НО. или даже ДВА НО.
    inline-ассемблер в gcc достаточно хорошо сделан, как я понимаю для быстродействия...это очень даже хорошо =).. показывать коду на СИ...какие регистры будут задействованы... где хранить операнды...в памяти или в регистрах (лучше конечно же в eax)
    но блин... AT&T Синтаксис, конечно хорошо.. но очень не привычен... и не всегда понятен с полу взгляда (
    asm("movl %1, %%eax;
    movl %%eax, %0;"
    :"=r" (b) //выходной параметр
    :"r" (a) // входной параметр
    : "%eax"
    ))

    Как сделать так, чтоб можно было делать асм вставки в код на си..в интеловской нотации ?(под gcc)
     
  2. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Никак, пока ты используешь gcc и gnu as. Попробуй другой асемблер - fasm, nasm... Если они выплюнут нормальный .o файл - то всё будет пучком.
     
  3. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    s0larian
    Никогда не использовал as =)
    На асме, программы компилировал всегда через nasm.
    А тут, прям в коде на языке СИ , нужно асм вставку сделать =)... знаю, как это сделать в AT&T , и на мой взгляд, это слегка не удобно (.. хочу такие вставки делать в интеловской нотации.......... и вот вопрос) как это сделать?...
    может можно по отдельности ..написать код на асме.и на си...потом переделать в объектные файлы.. .о и затем их както соеденить? ) (ниразу так не делал...)........................как это сделать?
     
  4. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    Код (Text):
    1.     asm(".intel_syntax noprefix");
    2.     asm("xor eax, eax");
    Только еще с опцией -mintel-syntax
    Правда, это для MinGW работало...
     
  5. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    stellaco, асм вставки в gcc идут в той же нотации что принимает gnu as (из binutils), т.к. этот компилер выплёвывает асм и скармливает его ассемблеру. То есть, gcc "компилирует в асм".

    Поэтому, если хочешь intel systax, компиль отдельный файл в nasm/fasm/итд, и линкуй к своему коду.
     
  6. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    ИМХО, стоит бросить заниматься ерундой и перейти на винду...
    В плане программирования здесь все гораздо лучше :)
     
  7. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    K10
    омг
     
  8. Clear_Energy

    Clear_Energy Алексей

    Публикаций:
    0
    Регистрация:
    3 ноя 2008
    Сообщения:
    375
    K10
    +1 =)
    Жжошь
     
  9. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    K10
    Вы пробовали программировать для *NIX систем?... вообще хоть когда то пользовались?
     
  10. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    stellaco
    Пробовал, пользовался (пробовал пользоваться).
     
  11. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    По-моему, программировать под *nix попрощее будет.
     
  12. KoliaZP

    KoliaZP New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2009
    Сообщения:
    8
    +1:)

    не совсем по сабжу... но все же
    iretd в AT&T синтаксисе как будет?

    хм... плохо искал... http://www.wasm.ru/forum/viewtopic.php?id=24940
     
  13. Yorik

    Yorik Артур

    Публикаций:
    0
    Регистрация:
    11 янв 2008
    Сообщения:
    18
    Всё верно,вот такой код у меня работает и в MinGW`e и в никсах(фряха)
    Код (Text):
    1. #include <stdio.h>
    2.  
    3. int xasm = 0;
    4.  
    5. int main()
    6. {
    7.     //int xasm = 0;
    8.    
    9.     __asm(".intel_syntax noprefix\n");
    10.     __asm("mov eax, 5\n");
    11.     __asm("shl eax, 4\n");
    12.     __asm("mov _xasm, eax\n");
    13.    
    14.     printf( "%X\n", xasm );
    15.    
    16.     return 0;
    17. }
     
  14. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    iretl
     
  15. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Yorik
    Огромное спасибо за пример кода. Всё работает )
     
  16. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Ещё один вопрос.
    Как воспринимает следующее __asm("mov eax, 5"); компилятор GCC, как функцию? или мнемонику?
    надеюсь при компиляции этого кода, Не создаётся что-то наподобии
    push ebp
    mov ebp, esp

    ?
     
  17. Yorik

    Yorik Артур

    Публикаций:
    0
    Регистрация:
    11 янв 2008
    Сообщения:
    18
    мнемонику