Описание используемых директив и команд ассемблера




Цель работы

 

Изучить и понять принцип работы транслятора. Исследовать формат данных объектного файла для шестнадцатиразрядной системы 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|.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-04-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: