Допустим надо создать небольшую базу с парами "МНЕМОКОД:ОППКОД", и с ее помощью создавать целые команды (простейшие). Почитал инфу об этом, сравнил в дизасемблере результаты и нифига не понял O_o Взял стандартную виндовую утилиту "debug" и создал следующую бесполезную com программу: Код (Text): mov dx, 0005 mov bx, 0006 mov ax, 0007 add dx, 0005 add bx, 0006 add ax, 0007 sub dx, 0005 sub bx, 0006 sub ax, 0007 Потом взял дизасемблер и все прочитал заново: Код (Text): HEX ASM BIN BA0500 mov dx, 0005 1011 1010 00000101 00000000 BB0600 mov bx, 0006 1011 1011 00000110 00000000 B80700 mov ax, 0007 1011 1000 00000111 00000000 83C205 add dx, 0005 1000 0011 11000010 00000101 83C306 add bx, 0006 1000 0011 11000011 00000110 050700 add ax, 0007 0000 0101 00000111 00000000 83EA05 sub dx, 0005 1000 0011 11101010 00000101 83EB06 sub bx, 0006 1000 0011 11101011 00000110 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. Вобщем ткните плиз где можно прочитать или обьясните, а то что-то не понимаю ((
В руководствах 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.
kalexi Увы, но в случае с системой команд IA-32 (и даже куда более простой в 16-разрядных процах, предшествующих её появлению -- 8086/88, 186/188, 286) так просто решить проблему невозможно в принципе. Код операции не занимает строго фиксированное число разрядов и не выводится однозначно из мнемоники команды.