В мануале от интела для п4 (Instruction Set Reference N-Z order number 253667) 0x6C ins byte [edi],dx (Yb,DX) 0x6D ins word/dword [edi],dx (Yv,DX) 0x6E outs dx,byte [esi] (DX,Xb) 0x6F outs dx,word/dword [esi] (DX,Xv) У оли (1.08 и 1.10) 6C INS BYTE PTR ES:[EDI],DX ; I/O command 6D INS DWORD PTR ES:[EDI],DX ; I/O command 6E OUTS DX,BYTE PTR ES:[EDI] ; I/O command 6F OUTS DX,DWORD PTR ES:[EDI] ; I/O command Скорее всего прав интел, значит это баг оли?
А вот что у меня Olly кажет: Код (Text): 6C ins [byte es:edi], dx ; I/O command 6D ins [dword es:edi], dx ; I/O command 6E outs dx, [byte es:edi] ; I/O command 6F outs dx, [dword es:edi] ; I/O command Дело в том, что у x86 нет и никогда не было стандартного ситаксиса.
А для проверки опкода пойдет Debug или Soft-Ice. И в Hiew если ввести 6E и 6F то тaм всего лиш outsb outsw. Это правильно ? Эти команды похожи на MOVS и SCAS для упрощения можно вводить соотв. MOVSB и MOVSW. Насколько я помню возможна отмена только одного заданного (ES) регистра.
В мануале конечно опечатки есть: в таблице написано E(SI), далее в тексте "read from either the DS:EDI or the DSI registers", а еще дальше опять "The location is always specified by the DSE)SI registers". Вот только вопрос, что из всего этого верно. Судя по количеству повторов, видимо, ESI.
Еще один недочет в OllyDasmEngine movsx/movsz/bswap неправильно декодируются с перефиксом размера 0x66 ;у олли movsx reg16, mem16 movzx reg16, mem16 bswap reg16 ;правильный вариант movsx reg32, mem16 movzx reg32, mem16 bswap reg32
zzzyab >А для проверки опкода пойдет Debug или Soft-Ice. Debug нет, SoftIce я неиспользую поэтому невкурсе, fasm очень хорош для этого дела я использую его >И в Hiew если ввести 6E и 6F то тaм всего лиш outsb outsw. Это правильно ? Да, это короткая форма записи >Насколько я помню возможна отмена только одного заданного (ES) регистра. Нет, переопределить сегмент можно только для источника, приемник всегда использует сегмент ES
Smile О каких опкодах идёт речь в случае с movsx/movzx/bswap? Просто проверил Код (Text): 66:0FBF05 50004000 movsx ax, [word ds:400050] загружает в ax,7369h (из заголовка PE) Старшая половина eax не меняется. Команда Код (Text): 66:0FC8 bswap ax просто обнуляет ax. Согласно мануалу команды bswap reg16 нет. Это всё на AMD Athlon. Или я (опять, как и в первый раз =) что-то напутал? Ещё, на всякий случай, по поводу FASM - он кодирует некоторые инструкции не так как это принято у микрософтовских и интеловских компиляторов: Код (Text): 33DB xor ebx,ebx ; микрософт 31DB xor ebx,ebx ; FASM
S_T_A_S_ Я тоже, естественно, проверял эти инструкции >Или я (опять, как и в первый раз =) что-то напутал? Э... м... ну, вообщем-то, если инструкция работает (неправильно), то это еще не значит что она правильно декодированна >Согласно мануалу команды bswap reg16 нет. Я о томже. Также, согласно ману, нет инструкции movsz/movzx reg16, mem16 >просто обнуляет ax В мане пишут, что с перефиксом размера перед bswap, результат становится неизвестен, на практике младшие 16бит сбрасываются. Мне кажется инструкция от этого не становится bswap reg16 а остается bswap reg32 или mov reg32,mem16 но со другим эффектом и именно так она декодируется в моем дизассемблере. >Ещё, на всякий случай, по поводу FASM - он кодирует некоторые инструкции не так как это принято у микрософтовских и интеловских компиляторов: 33DB xor ebx,ebx ; микрософт 31DB xor ebx,ebx ; FASM Млин, ну этоже фасм, а не какойнить там микрософ Есть такое дело, в регистровых операциях он предпочитает мненять местами поля reg/opc и reg/mem, вместо того чтобы установить бит D.
Дык, то что инструкции нет в мануале - это совершенно не значит, что её нет на самом деле! Опкод декодируется и выполняется процем без проблем, исключений не возникает, значит инструкция ЕСТЬ, но не документирована. Причём результат инчтрукции можно обосновать логически:<font face="monospace] Код (Text): 0FC8 BSWAP EAX: TEMP ←DEST DEST[7..0] ←TEMP(31..24] DEST[15..8] ←TEMP(23..16] DEST[23..16] ←TEMP(15..8] DEST[31..24] ←TEMP(7..0] 66:0FC8 BSWAP AX: TEMP ←DEST & 0FFFFh ; AX ! ALU_REG[7..0] ←TEMP(31..24] ; 0! ALU_REG[15..8] ←TEMP(23..16] ; 0! ALU_REG[23..16] ←TEMP(15..8] ; AH ALU_REG[31..24] ←TEMP(7..0] ; AL DEST ←ALU_REG & 0FFFFh </font><!--face-->Тут нет "простого" обнуления, всё как и положено работает, но в результате таких операций получается 0. И ещё. Диззассемблер от самой AMD прекрасно этот bswap ax понимает. Интеловского у меня нет. _153363657__bswap.PNG
>Дык, то что инструкции нет в мануале - это совершенно не значит, что её нет на самом деле! Аналогично >Опкод декодируется и выполняется процем без проблем, исключений не возникает, значит инструкция ЕСТЬ, но не документирована. Ну, я бы сказал последствия использования опкода с модификатором размера недокументированны, а опкод и инструкция известны. Рылся в сети, у интела по поводу bswap ничего не нашел, у амд тоже. ms vc++ 6.0 - дизассемблирует bswap и movsx/zx c параметром reg32 но ассемблировать может как reg16, Тасм тоже не ругается. hiew611 - инструкцию bswap c перефиксом размера не распознает, но movsx/sz видит с параметром reg16 Так-что перефикс размера допустим и используется, заявление о недочете деодирования movsz/sx bswap в OllyDasmEngine снимается Может сделаю так и в своем дизассемблере, всетаки эффект инструкции другой и используемые операнды тоже другие Всем спасиба,истина установлена... или уже совсем рядом