Здравствуйте. Пишу диссасемблер на tasm. И столкнулся со следующей трудностью. Попробую объяснить на элементарном примере Например имею команду MOV BX, CS Её код в Hex будет 8C CB В bin 10001100 11001011 При разборе получаю * Opcode - 23h * D - 0 * W - 0 * MOD - 11b * REG - 001b * R/M - 011b Вопрос - как определить что поле REG содержит именно регистр сегмента? Уже долгое время пытаюсь понять, но так пока и несмог найти хорошего ответа.
А больше никак нельзя? Тоесть, например надо составить таблицу опкодов которые работают с сегментами?
В коде операции это явно не кодируется. Можно строить предположения конечно проанализировав несколько подобных команд и их опкодов, но писать лучше не отклоняясь от документации, т к в будущем подобная хитрожопость обязательно выйдет боком amd intel manuals -> www.google.com
nbyte просто в Intel синтаксисе под ассемблерной мнемоникой mov скрывается несколько разных опкодов, для обычных регистров один опкод, для сегментных другой и не только. Глянь ещё AT&T-синтаксис, но он жутко неудобный имхо
Хммм, спасибо за ваши ответы. Хоть на этом форуме есть люди которые это могут подсказать . Теперь буду уверен что по другому нельзя сделать.
nbyte уже составили, смотрите Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2B A.3 ONE, TWO, AND THREE-BYTE OPCODE MAPS
Если дизасм полноценный, надо ещё заранее знать, под какой режим предназначен дизассемблируемый код. Например, в 16- и 32-разрядном режимах один и тот же код команды должен дизассемблироваться по-разному (с 16- и 32-разрядными операндами и адресами).