Цель: Изучение основ работы ассемблера, создание простой программы генерации кода виртуального процессора.
В общих случаях предложения языка Ассемблера состоят из следующих компонент: метка или имя; мнемоника; операнды; комментарии. Метка или имя является необязательным компонентом. Не во всех языках Ассемблеров эти понятия различаются. Если они различаются (например, MASM), то метка - точка программы, на которую передается управление, следовательно, метка стоит в предложении, содержащем команду; имя - имя переменной программы, ячейки памяти, следовательно, имя стоит в предложении, содержащем псевдокоманду резервирования памяти или определения константы. В некоторых случаях метка и имя могут отличаться даже синтаксически, так, в MASM/TASM после метки ставится двоеточие, а после имени - нет.
На втором проходе ассемблера вычисляем расстояние от текущей программы до метки и помещаем в машинную инструкцию на место метки (позиционно независимый код).
В процесс распознания необходимо проверять выход констант за допустимые пределы (согласно двоичного представления для машинной инструкции): регистры – от r0 до r31, сдвиг – от 0 до 31, константа – от -32768 до 32767. Место, предназначенное для меток, на первом проходе не заполняем.
Например: Для входного файла
ADD	r5,r12,r30
QWERTY
MUL	r5,r12,r30
DIV	r5,r12,r30
MYLABEL
SUBI	r5,r12,1230
XOR	r5,r12,r30
AND	r5,r12,r30
OR	r5,r12,r30
LDD	r5,r12,5030
BEQ	r15, MYLABEL
Результат мог бы выглядеть так
ADD	keyword, opcode=6
	шаблон = REG,REG,REG
	первый регистр - 5
	второй регистр - 12
	третий регистр – 30
Результат:0x13452689 или 1000101… (все 32 бита)
	ОК!
QWERTY 	new name, hash=24
MUL	keyword, opcode=2
	шаблон = REG,REG,REG
	первый регистр - 5
	второй регистр - 12
	третий регистр – 30
Результат:0x3DАF4568 или 1000101… (все 32 бита)
	ОК!
DIV	keyword, opcode=18
	шаблон = REG,REG,REG
	первый регистр - 5
	второй регистр - 12
	третий регистр – 30
Результат:0x3DАF4568 или 1000101… (все 32 бита)
	ОК!
MYLABEL 	new name, hash=13
	ОК!
SUBI	keyword, opcode=16
	шаблон = REG,REG,IMM
	первый регистр - 5
	второй регистр - 12
	константа – 1230
Результат:0x3DАF4568 или 1000101… (все 32 бита)
	ОК!
XOR	keyword, opcode=26
	шаблон = REG,REG,REG
	первый регистр - 5
	второй регистр - 12
	третий регистр – 30
Результат:0x3DАF4568 или 1000101… (все 32 бита)
	ОК!
AND	keyword, opcode=11
	шаблон = REG,REG,REG
	первый регистр - 5
	второй регистр - 12
	третий регистр – 30
Результат:0x3DАF4568 или 1000101… (все 32 бита)
	ОК!
OR	keyword, opcode=31
	шаблон = REG,REG,REG
	первый регистр - 5
	второй регистр - 12
	третий регистр – 30
Результат:0x3DАF4568 или 1000101… (все 32 бита)
	ОК!
LDD	keyword, opcode=12
	шаблон = REG,REG,IMM
	первый регистр - 5
	второй регистр - 12
	константа – 5030
Результат:0x3DАF4568 или 1000101… (все 32 бита)
	ОК!
BEQ	r15, MYLABEL
	шаблон = REG,LABEL
	первый регистр - 5
	метка – есть метка (-5)
Результат:0x3DАF4568 или 1000101… (все 32 бита)
	ОК!