Цель: Изучение основ работы ассемблера, создание простой программы генерации кода виртуального процессора.
Предложения языка Ассемблера описывают команды или псевдокоманды (директивы). Предложения-команды задают машинные команды вычислительной системы; обработка Ассемблером команды приводит к генерации машинного кода. Обработка псевдокоманды не приводит к непосредственной генерации кода, псевдокоманда управляет работой самого Ассемблера. Для одной и той же аппаратной архитектуры м.б. построены разные Ассемблеры, в которых команды будут обязательно одинаковые, но псевдокоманды м.б. разные.
Во всех языках Ассемблеров каждое новое предложение языка начинается с новой строки. Каждое предложение, как правило, занимает одну строку, хотя обычно допускается продолжение на следующей строке/строках. Формат допускает любое количество пробелов между составляющими предложения.
В общих случаях предложения языка Ассемблера состоят из следующих компонент: метка или имя; мнемоника; операнды; комментарии.
Метка или имя является необязательным компонентом. Не во всех языках Ассемблеров эти понятия различаются. Если они различаются (например, MASM), то метка - точка программы, на которую передается управление, следовательно, метка стоит в предложении, содержащем команду; имя - имя переменной программы, ячейки памяти, следовательно, имя стоит в предложении, содержащем псевдокоманду резервирования памяти или определения константы. В некоторых случаях метка и имя могут отличаться даже синтаксически, так, в MASM/TASM после метки ставится двоеточие, а после имени - нет.
Написать программу распознавания мнемоник ассемблерных команд. Входной файл содержит мнемоники команд (по одной в строке). Выходной файл – коды операций. Программа содержит упорядоченную таблицу структур (имя, код операции, шаблон распознавания).
Необходимо использовать бинарный поиск по таблице. В случае успеха поиска выводить код операции, иначе – сообщение об ошибке: текст строки, номер строки, место в строке. Команды ассемблера не зависят от регистра. Мнемоника может начинаться не с начала строки.