допустим у меня есть некая последовательность инструкций FA FB CF 23 68 CD20 90 90 91 90 ... . как теперь ее перевести вручную на узык ассемблера? тоесть чтоб типа такого было: mov ax,cx inc ax dec cx nop . . .. и тд, вопщем конкретный процесор меня не интересует, хочу сам сделать свой вирутальный проц. но вот как можна закодировать команды и регистры не понимаю((( может кто - то наведет на правильную мысль.
для простой можна и сейчас, просто я не могу понять как закодировать инструкции вместе с данными одноврименно и причем так чтоб длина каждой инструкции не имела ограничений((
Т.е. вы хотите чтобы что-то вам переводил мануалы с английского на русский, и параллельно их разжевывал?
P.S. Сходите в магазин технической книги - купите там например справочник Юрова. Там как раз на русском и с примерами опкодов все показано.
ясно. . . .ток нельзя сразу было так дать прямую ссылку на литературу, а не два поста зря писать без пользы.
Батенька, вы бы для начала её сами попробывали поискать. Ладно вы английский не знаете, то про google или yandex знать должны.
XshStasX Единого алгоритма нет. Представь себе, что процессор делаешь ты. Тебе нужны команды - mov reg1, reg2 - add reg1, reg2 - sub reg1, reg2 - ... Поскольку вопросов о совместимости при создании процессора не стояло (не было еще процессоров, первая модель), разработчики пошли по логичному пути: - пусть опкод 000000xx означает команду add... и так далее. Все остальные модели придерживаются совместимости с предыдущими. Наиболее используемые и необходимые инструкции имеют длину 1 байт, или 1 байт + операнды. Для операндов используется кодировка mod|rm, о которой можно прочитать в мануале Intel. Инструкции, добавленные позднее, уже 2-х и более байтовые, с первым байтом 0fh. Некоторая логика в "алгоритме кодирования" все-таки есть, и ради бога, выясняй ее САМ! Для того, чтобы объяснить (не имея уже подготовленой таблицы кодировки), требуется время, которое вполне можешь затратить и ты, разбираясь в таблице опкодов. Сразу скажу, что некоторую часть опкодов можно представить в виде ppppcciw, где биты "pppp" задают группу команд, "сс" задают команду внутри группы, "i" - определяет наличие операндов в виде "mod - r/m" или их отсутствие и операцию с (E)AX, а "w" - байтовую или полнорегистровую (слово или двойное слово в зависимости от установленного режима) операцию. Но это далеко не универсальный "алгоритм". Так что таблицы опкодов в руки - и вперед на мины! =)
ага ясненько, ну я так уже по выше приведенной ссылке чуток начал вникать. . .так что будем дальше думать))
просто меня волнует то что: у нас нет фиксированой длины команды и например когда мы читаем один байт, то получаем одну команду а читаем еще один байт то получаем другую....и как тогда определиться что исполнять?
XshStasX Ну например так: - читаем байт. -- если это 0Fh, то расширенная команда, читаем следующий и ищем по таблице команд с 0F --- ... -- если это префикс изменения разрядности или адресности, имеем это в виду при дальнейшем разборе -- если команда имеет операнд mod-r/m, то следующий байт - операнд, требующий разбора --- если операнд mod-r/m использует память, непосредственное значение или инкремент, то далее идет адрес памяти, непосредственное значение или инкремент адреса, обязательно учитываем предыдущий префикс изменения разрядности операнда или адреса, или его отсутствие -- если команда имеет непосредственный операнд (без mod-r/m), то далее идет этот операнд, длина определяется байтовой или полнорегистровой операцией, и (возможно) предшествующим префиксом ... или как-то так. Вообще, дизассемблер - это интересная штука, настоятельно рекомендую, если будешь делать, НЕ БРАТЬ ГОТОВЫЙ алгоритм, а написать его с нуля, для тренировки и понимания. Именно с нуля сам алгоритм, а не его реализацию - по любому работа "бессмысленная", ибо дизассемблеров пруд пруди, но написание собственного алгоритма - это творчество, а реализация чужого - онанизм и ничего кроме освоения синтаксиса конкретного компилятора не даст.
Конечно нет - т.к. общая длина команды складывается из опкода + аргументов (если они есть). Количество и тип аргументов зависит от самой команды (где-то они лежат сразу в опкоде, где-то надо читать следующий байт и т.д.). Примеры: 0F 31 = RDTSC (опкод = 2 байта) 90 = NOP (опкод = 1 байт) 91 = XCHG EAX, ECX (опкод = 1 байт и аргумент ECX лежат в опкоде)
XshStasX ) - оптика тут совсем не причём ) ищи "опкоды" http://www.citforum.ru/book/cook/intel.shtml http://www.gaw.ru/html.cgi/txt/doc/micros/avr/asm/start.htm http://emuverse.ru/wiki/Zilog_Z80/Система_команд http://code.google.com/p/vector06cc/wiki/KP580BM1
Руководство от Интел по-любому нужно иметь, скажем, как надежный источник. Да и формат команд так преподносится в картинках, как будто специально для чайников.