Помогите разобраться с синтаксисом ассемблера

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

  1. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    В общем есть проект под Bloodshed Dev-C++
    И таместь такой код который я не могу понять
    Код (Text):
    1. void gbz80_inc(byte* reg)
    2. {
    3.      asm volatile (    
    4.      "movl $0, %1\n"      // load 0 to NFLAG
    5.      
    6.      "incb %2\n"
    7.          
    8.      "lahf\n"             // get flags
    9.      "andb $1,%%bh\n"     // carry not affected
    10.      "andb $0xFE,%%ah\n"
    11.      "orb %%ah, %%bh \n"
    12.      
    13.      : "=b" (flags), "=g" (NFLAG), "=q" (*reg)
    14.      : "2" (*reg), "0" (flags)
    15.      : "cc", "ah");  
    16. }
    Не понятны следующие моменты
    1) В функции есть аргумент byte* reg
    Где он дальше используется что-то я не пойму
    2) Что это за строки такие

    : "=b" (flags), "=g" (NFLAG), "=q" (*reg)
    : "2" (*reg), "0" (flags)
    : "cc", "ah");
    Что они делают не могу понять. В инете не нашел описания. Подскажите линк,плиз.
    3) В Bloodshed Dev-C++
    используется gcc и g++. ОРн понимает только at&t синтаксис или ещё и интел?
    4) Тоже смамое но про MSVS. А понимает только intel или можно как то включить at&t? Спасибо.
     
  2. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Ответы а все твои вопросы.
    http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
     
  3. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    : "=b" (flags), "=g" (NFLAG), "=q" (*reg)
    : "2" (*reg), "0" (flags)
    : "cc", "ah");

    ничего я не понял по этому поводу
     
  4. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    плохо читал.
     
  5. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    movl $0, %1\
    "2" (*reg), "0" (flags
    Не понятно мне вот это.
    Что значит переслать 0 ? Куда что значит %1.

    "=b" (flags), "=g" (NFLAG), "=q" (*reg)
    что значит =b.Что за b или g. Сорри но у меня плохо с английским
     
  6. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    В флагах gcc где-то было насчёт intel'овского синтаксиса. Может это позволяет использовать intel синтаксис в inline ассемблере. А может это только для работы вместе с опцией -S.
    Как куда, там же всё написано, в первый аргумент, то есть во flags.
    Эээ. Ты хочешь чтобы тебе перевели документацию?
     
  7. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Нет, хочу чтобы пример объяснили и всё
     
  8. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Парни умоляю, ничего не понимаю, тупой я
    Расккажи те что всё этозначит. Подскажите как самому можно в интел синтаксис перевести. Скину 10 вебмани тому кто всё объяснит Плиз

    void gbz80_dec(byte* reg)
    {
    asm volatile (
    "movl $1, %1\n" // load 1 to NFLAG

    "decb %2\n"

    "lahf\n" // get flags
    "andb $0x01,%%bh\n" // carry not affected
    "andb $0xFE,%%ah\n"
    "orb %%ah, %%bh \n"

    : "=b" (flags), "=g" (NFLAG), "=q" (*reg)
    : "2" (*reg), "0" (flags)
    : "cc", "ah");
    }

    void gbz80_rlca()
    {
    asm volatile (
    "xorb %%ah, %%ah\n"
    "movl $0, %1\n" // load 0 to NFLAG

    "rolb %2\n"

    "rclb %%ah\n" // only carry affected

    : "=a" (flags), "=g" (NFLAG), "=q" (A)
    : "2" (A)
    : "cc");
    }

    : "=a" (flags), "=g" (NFLAG), "=q" (A)
    : "2" (A)
    : "cc");

    Не понимаю что всё это значит что за =a =g =q cc AA