Оптокоды

Тема в разделе "WASM.BEGINNERS", создана пользователем XshStasX, 17 июн 2009.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    допустим у меня есть некая последовательность инструкций
    FA FB CF 23 68 CD20 90 90 91 90 ... .
    как теперь ее перевести вручную на узык ассемблера?
    тоесть чтоб типа такого было:
    mov ax,cx
    inc ax
    dec cx
    nop
    . . ..
    и тд, вопщем конкретный процесор меня не интересует, хочу сам сделать свой вирутальный проц. но вот как можна закодировать команды и регистры не понимаю(((
    может кто - то наведет на правильную мысль.
     
  2. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Берем мануал интела по командам х86 и вперед.
    Не рановато-ли? :))
     
  3. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    не думаю...
    по поводу мануала интела думал ток проблема в том что он на англ(((
     
  4. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    для простой можна и сейчас, просто я не могу понять как закодировать инструкции вместе с данными одноврименно и причем так чтоб длина каждой инструкции не имела ограничений((
     
  5. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    вот какой алгоритм кодирования всех этих инструкций?
     
  6. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Т.е. вы хотите чтобы что-то вам переводил мануалы с английского на русский, и параллельно их разжевывал?
     
  7. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    та не прошу переводить, просто росказать, алгоритм кодирования инструкций и все
     
  8. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    P.S. Сходите в магазин технической книги - купите там например справочник Юрова. Там как раз на русском и с примерами опкодов все показано.
     
  9. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    ясно. . . .ток нельзя сразу было так дать прямую ссылку на литературу, а не два поста зря писать без пользы.
     
  10. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    ... в любом случае гугл никто не отменял:
    http://protect.htmlweb.ru/disasm.htm
     
  11. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    а за справочник спасибо) сейчас в инете поищу. . .
     
  12. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Батенька, вы бы для начала её сами попробывали поискать. Ладно вы английский не знаете, то про google или yandex знать должны.
     
  13. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    искал ток запрос ввел не оч по теме: "оптокоды" и тут в литературе смотрел на wasm.ru
     
  14. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    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" - байтовую или полнорегистровую (слово или двойное слово в зависимости от установленного режима) операцию. Но это далеко не универсальный "алгоритм". Так что таблицы опкодов в руки - и вперед на мины! =)
     
  15. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    ага ясненько, ну я так уже по выше приведенной ссылке чуток начал вникать. . .так что будем дальше думать))
     
  16. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    просто меня волнует то что:
    у нас нет фиксированой длины команды
    и например когда мы читаем один байт, то получаем одну команду а читаем еще один байт то получаем другую....и как тогда определиться что исполнять?
     
  17. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    XshStasX

    Ну например так:

    - читаем байт.
    -- если это 0Fh, то расширенная команда, читаем следующий и ищем по таблице команд с 0F
    --- ...
    -- если это префикс изменения разрядности или адресности, имеем это в виду при дальнейшем разборе
    -- если команда имеет операнд mod-r/m, то следующий байт - операнд, требующий разбора
    --- если операнд mod-r/m использует память, непосредственное значение или инкремент, то далее идет адрес памяти, непосредственное значение или инкремент адреса, обязательно учитываем предыдущий префикс изменения разрядности операнда или адреса, или его отсутствие
    -- если команда имеет непосредственный операнд (без mod-r/m), то далее идет этот операнд, длина определяется байтовой или полнорегистровой операцией, и (возможно) предшествующим префиксом
    ...
    или как-то так. Вообще, дизассемблер - это интересная штука, настоятельно рекомендую, если будешь делать, НЕ БРАТЬ ГОТОВЫЙ алгоритм, а написать его с нуля, для тренировки и понимания. Именно с нуля сам алгоритм, а не его реализацию - по любому работа "бессмысленная", ибо дизассемблеров пруд пруди, но написание собственного алгоритма - это творчество, а реализация чужого - онанизм и ничего кроме освоения синтаксиса конкретного компилятора не даст.
     
  18. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Конечно нет - т.к. общая длина команды складывается из опкода + аргументов (если они есть). Количество и тип аргументов зависит от самой команды (где-то они лежат сразу в опкоде, где-то надо читать следующий байт и т.д.).

    Примеры:
    0F 31 = RDTSC (опкод = 2 байта)
    90 = NOP (опкод = 1 байт)
    91 = XCHG EAX, ECX (опкод = 1 байт и аргумент ECX лежат в опкоде)
     
  19. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    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
     
  20. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Руководство от Интел по-любому нужно иметь, скажем, как надежный источник. Да и формат команд так преподносится в картинках, как будто специально для чайников.