Как Ассемблеры отображают мнемонические инструкции x86 для двоичных машинных инструкций?

Мне интересно писать ассемблер x86. Мне интересно, что это хороший способ сопоставить мнемонические инструкции сборки x86 (используя синтаксис, подобный Intel) в соответствующие инструкции двоичного машинного кода.

Ответ 1

Вы хотите понять физическое сопоставление мнемоники с машинным кодом? Если в этом случае тома 2А и 2В справочника Intel IA32/IA64 описывают двоичный формат машинного кода x86.

страница с инструкциями x86 в Википедии содержит компактный список всех инструкций, классифицированных по их введению, что может помочь вам определить приоритеты что реализовать в первую очередь.

Однако, если вы спрашиваете, как перейти к разбору текстового файла ассемблерного кода, чтобы добраться до точки, когда ваша программа могла начать писать машинный код, вам в основном нужно понять, как писать компилятор. Инструменты lex и yacc - хорошие места для начала, но если вы не знаете, как построить компилятор, вам также понадобится получить книгу. Я думаю, что Книга Дракона - лучшая из них, но есть много других книг, которые вы могли бы использовать, у SO есть много рекомендаций.

Ответ 2

Для x86 это сложно, как черт. Немного менее сложно, поскольку 32-разрядные процессоры заняли верх, но да. Все еще боль.

Вы можете взглянуть на nasm (http://www.nasm.us). Это 32-разрядный ассемблер с открытым исходным кодом. Посмотрите, как они это делают. Или используйте его вместо этого.:)

Ответ 3

Это просто прямое сопоставление "один к одному"; документация Intel описывает все инструкции и их кодировки. Вам нужно будет создать гигантскую таблицу поиска или что-то подобное, чтобы выполнить сопоставление и генерировать код.