необходимо разобраться с ассемблерными вставками в языке С/C++

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 27 ноя 2011.

  1. Psionic

    Psionic Member

    Публикаций:
    0
    Регистрация:
    25 сен 2008
    Сообщения:
    156
    Я не о том я о __asm. Мне это как-бы проще и понятнее чем то как сношаются gas/g++.
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    amvoz
    вообще чет подбор понятий просто взрывает мозг... и так у тебя есть процессор архитектуры x86... не обязательно Intel, может быть AMD, но с архитектурой x86... ты пишешь программу с использованием компилятора gcc/g++ и собираешь ее для запуска на архитектуре x86... набор команд, регистров и тд для архитектуры x86 один и тот же, например есть такие регистры: eax, ebx, ecx, edx и тд... ассемблер, "встроенный" в gnu compiler collection может понимать несколько синтаксисов языка ассемблер: at&t и intel... и он позволяет тебе решить, в каком виде ты будешь скармливать ему программу: в синтаксисе at&t или intel, с префиксом (%) или без...

    не учи его плохому)) а то потом будут темы возникать: "почему у меня fasm/nasm/masm/yasm/и тд не компилит %eax?"))

    почему нас это должно волновать в данной теме?

    ЗЫ по теме, наверное: http://ru.wikipedia.org/wiki/X86
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Rel, я понял не всё и щас я постараюсь сказать, что я не понял
    Я понял, что можно использовать либо синтаксис назовём его условно(!) Intel либо синтаксис нахзовём его условно опять же AT&T

    (хотя для меня было бы привычнее синтаксис masm и чё-то там ещё, но не суть)

    Ещё я понял, что если мы используем синтаксис Intel,мы не пишем % перед именем регистра, если AT&T то пишем

    А теперь главное. В примере, который у меня в книге есть, там пример для синтаксиса AT&T и там ДВА знака процента. Понимаете, два.

    //Тут ремарка, что ни значат, я не знаю, но что значит один из них- догадываюсь:
    //"применение втоporo знака "%" требуют правила конструкции аsm"
    //речь идёт, напомню о синтаксисе AT&T



    Раз и два.
    Значит что? Значит если мы пишем тот же код но с использованием синтаксиса Intel, значит, один (о котором ремарка) надо убрать. Один. И вот мы из двух знаков процента %% убираем один знак % и остаётся один %. Ну это я такие глупые выводы делаю

    %eax

    А теперь простой такой и наивный вопрос, то, что мне и непонятно- почему по ссылкам, что у меня есть, (а там синтаксис Intel) нигде знака % не стоит перед именем регистра, а вот щас я должен используя ТОТ ЖЕ синтаксис писать % перед именем регистра.

    Ну вот хотелось бы обсудить этот вопрос. А книжки по masm у меня есть. У меня AMD.
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    так используй синтаксис интел и не думай... или как всегда можно заюзать сторонний ассемблер...

    в википедии есть такой момент о макроподстановках:
    Код (Text):
    1. ; Конструкция:
    2. asm ("movl %0,%%eax"::"i"(1));
    3. ; Превратится в
    4. movl $1,%eax
    и еще:
    из этого я делаю вывод, что один знак процента это префикс, указывающий макроподстановке, что это грубо говоря "ключевое слово", а не константа/переменная и тд... префикс, который можно отключить с помощью "noprefix", как тебе рассказывал cppasm... второй знак процента - часть имени регистра в синтаксисе AT&T... как бы могу ошибаться, так как не пишу никогда в AT&T синтаксисе, просто логический вывод из статьи на википедии....