Опкоды: как создавать команду в бинарном виде?

Тема в разделе "WASM.ASSEMBLER", создана пользователем kalexi, 1 фев 2009.

  1. kalexi

    kalexi New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2007
    Сообщения:
    43
    Допустим надо создать небольшую базу с парами "МНЕМОКОД:ОППКОД", и с ее помощью создавать целые команды (простейшие). Почитал инфу об этом, сравнил в дизасемблере результаты и нифига не понял O_o

    Взял стандартную виндовую утилиту "debug" и создал следующую бесполезную com программу:
    Код (Text):
    1. mov dx, 0005
    2. mov bx, 0006
    3. mov ax, 0007
    4.  
    5. add dx, 0005
    6. add bx, 0006
    7. add ax, 0007
    8.  
    9. sub dx, 0005
    10. sub bx, 0006
    11. sub ax, 0007
    Потом взял дизасемблер и все прочитал заново:

    Код (Text):
    1. HEX         ASM             BIN
    2. BA0500                 mov dx, 0005     1011 1010 00000101 00000000
    3. BB0600                 mov bx, 0006     1011 1011 00000110 00000000
    4. B80700                 mov ax, 0007     1011 1000 00000111 00000000
    5.  
    6. 83C205                 add dx, 0005     1000 0011 11000010 00000101
    7. 83C306                 add bx, 0006     1000 0011 11000011 00000110
    8. 050700                 add ax, 0007     0000 0101 00000111 00000000
    9.  
    10. 83EA05                 sub dx, 0005     1000 0011 11101010 00000101
    11. 83EB06                 sub bx, 0006     1000 0011 11101011 00000110
    12. 2D0700                 sub ax, 0007     0010 1101 00000111 00000000
    Как писалось тут http://protect.htmlweb.ru/disasm.htm формат команды следующий:

    Байт:
    7--\
    6 |код операции
    5 |
    4--/
    3--\
    2 | условие ----\
    1--/ Направление | регистр
    0--- Размер -----/


    Но нифига не получается:
    83C306 add bx, 0006 1000 0011 11000011 00000110
    050700 add ax, 0007 0000 0101 00000111 00000000
    Бит отвечающий за размер установлен в 1, а команда занимает то 1 байт то 2.

    Вобщем ткните плиз где можно прочитать или обьясните, а то что-то не понимаю ((
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    в статьях есть цикл "Заклинание кода". Может быть он тебе поможет
     
  3. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    В руководствах Intel все хорошо описано. Если будут конкретные вопросы, спрашивай.

    Бит w (бит 0 в первом байте опкода) определяет размерность операндов, а бит s длину непосредственного операнда в опкоде - короткий (от -128 до 127) или длинный.

    83C306 add bx, 0006 10000011 11000011 00000110
    Бит s=1 - короткий операнд в опкоде

    050700 add ax, 0007 00000101 00000111 00000000
    Особая форма команды, применимая только к аккамулятору (в данном случае регистру ax). Здесь присутствует только бит w. В данном случает бит w=1, т.е. используется регистр ax, а не al. Непосредственный операнд в опкоде всегда кодируется полностью, т.е. короткого операнда быть не может, но зато отсутствует байт ModRM. Чтобы закодировать короткий операнд, нужно использовать основную форму опкода - 80sw /0.
     
  4. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    kalexi
    Увы, но в случае с системой команд IA-32 (и даже куда более простой в 16-разрядных процах, предшествующих её появлению -- 8086/88, 186/188, 286) так просто решить проблему невозможно в принципе. Код операции не занимает строго фиксированное число разрядов и не выводится однозначно из мнемоники команды.