Цель работы
Изучить и понять принцип работы транслятора. Исследовать формат данных объектного файла для шестнадцатиразрядной системы DOS для последующего преобразования его в файл программы.
Расчет варианта задания производится по формуле:
компилятор программа ассемблер алгоритм
где NG - последние две цифры учебной группы; NS - номер студента в списке; KV - количество вариантов в соответствующей группе команд.
Получили следующие команды: NEG, JE, ADC, SHL, INC.
Задание: Для заданного набора команд разработать, отладить и протестировать программу - компилятор.
Разработка контрольного примера
.asm является программой для нахождения разницы между двумя большими числами (32 разряда). Использует все заданные команды, JE, NEG, SHL, INC и кроме того команды MOV, INT.segment; сегмент данныхdw 1001h; a1, a2, b1, b2 - исходные данныеdw 10h; с1, с2 - результат
b1 dw 0abcdhdw 20h
c1 dw 0dw 0dw 4c00h; 4ch - ф-ция выхода, 00h - код возврата
datas endssegment:cs:codes, ds:datasax, datasds, ax ax, a1;
mov dx, a2; загрузить данные в bx, b1; регистры cx, b2; ax; m1; dx; инверсия первого числа
m1: neg dx; di, c1; 0 -> бит CF
shl di, 1; ax, bx; сложить младшие части dx, cx; сложить старшие части и бит CF m2 c1, ax; сохранить: mov c2, dx; результат ax, vix; завершение
int 21h; программыendsstart
Находится разница между двумя 32-разрядными операндами. Второй операнд инвертируется и складывается с первым. Операнды и результат располагаются в памяти. Базовый набор команд дополнен командами: MOV и INT, директивой - DW.
Данный контрольный пример без ошибок компилируется и линкуется стандартными компиляторами и линковщиками.
Описание используемых директив и команд ассемблера
: Сложение с переносом
Операция: Обычно используется при сложении многословных величин для учета бита переполнения в последующих фазах операции. Если флаг CF установлен в 1, то команда ADC сначала прибавляет 1 к операнду 1. Команда всегда прибавляет операнд 2 к операнду 1, аналогично команде ADD.
|
Флаги: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.
Объектный код (три формата): Регистр плюс регистр или память:|000100dw|modregr/m|.: Прерывание
Операция: Прерывает выполнение программы и передает управление по одному из 256 адресов (векторов прерывания). Команда INT выполняет следующее: 1) уменьшает значение SP на 2 и заносит в стек флаговый регистр, сбрасывает флаги IF и TF; 2) уменьшает значение SP на 2 и заносит регистр CS в стек, старшее слово из вектора прерывания помещает в регистр CS; 3) уменьшает значение SP на 2 и заносит регистр IP в стек, младшее слово из вектора прерывания помещает в регистр IP.
Флаги: Команда воздействует на флаги IF и TF.
Объектный код: |1100110v|-type-| (если v = 0, то type = 3).const: Прерывание
Операция: Прерывает выполнение программы и передаёт управление по одному из 256 адресов (векторов прерывания).
Объектный код: |11001101|-type-|./JZ: Переход по «равно» или по «нулю»
Операция: Используется после проверки знаковых или беззнаковых данных для передачи управления по другому адресу. Если флаг ZF равен единице (нулевое состояние), то команда прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход.
Флаги: Не меняются.
Объектный код: |01110100|-disp-|: Пересылка данных
Операция: Пересылает один байт или одно слово между регистрами или между регистром и памятью, а также передает непосредственное значение в регистр или в память. Команда MOV не может передавать данные между двумя адресами памяти (для этой цели служит команда MOVS). Существует семь типов команды MOV.
|
Флаги: Не меняются.
Объектный код (семь форматов):
Регистр/память в/из регистр:
|100010dw|modregr/m|
Непосредственное значение в регистр:
|1011wreg|-data-|data если w=1|
Память в регистр AX (AL):
|1010000w|addr-low|addr-high|
Регистр AX (AL) в память:
|1010001w|addr-low|addr-high|
Регистр/память в сегментный регистр:
|10001110|mod0sgr/m| (sg - сегментный регистр): Изменение знака числа
Операция: Меняет двоичное значение из положительного в отрицательное и из отрицательного в положительное. Команда NEG вычисляет двоичное дополнение от указанного операнда: вычитает операнд из нуля и прибавляет единицу. Операндом может быть байт или слово в регистре или в памяти.
Флаги: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.
Объектный код: |1111011w|mod011r/m|: Сдвиг влево или вправо
Операция: Выполняет сдвиг битов влево.
Флаги: Команда воздействует на флаги CF, OF, PF, SF и ZF (флаг AF не определен).
Объектный код: SAL/SHL: |110100cw|mod100r/m|.