Лабораторная работа №4. Генерация кода – второй проход

Цель: Изучение основ работы ассемблера, создание простой программы генерации кода виртуального процессора.

Краткие теоретические сведения

В общих случаях предложения языка Ассемблера состоят из следующих компонент: метка или имя; мнемоника; операнды; комментарии. Метка или имя является необязательным компонентом. Не во всех языках Ассемблеров эти понятия различаются. Если они различаются (например, 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 бита) ОК!