
- •Структура компиляторов. Общая схема работы компилятора.
- •Порядок обработки программ: Компиляция или ассемблирование, компоновка, отладка. Средства обработки программ: редакторы, компиляторы, ассемблеры, отладчики.
- •Основные функции библиотек программ и их составы.
- •Команды пересылки, сравнения и сдвига денных в ассемблерных программах.
- •Арифметические команды в ассемблерных программах; разновидности и примеры команд.
- •Команды передачи управления в ассемблерных программах: условные и безусловные переходы, циклы.
- •Загрузчики. Основные функции загрузчика.
-
Арифметические команды в ассемблерных программах; разновидности и примеры команд.
Команда ADD осуществляет сложение первого и второго операндов. Исходное значение первого операнда (приемника) теряется, замещаясь результатом сложения. Второй операнд не изменяется.
В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Пример:
Mov BX, 1FFEh
mov CX, 3
add ВХ, CX;
BX=2001h
ADC — Целочисленное сложение с переносом команда ADC осуществляет сложение первого и второго операндов, прибавляя к результату значение флага переноса CF. Исходное значение первого операнда (приемника) теряется, замещаясь результатом сложения. Второй операнд не изменяется.
В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака.
Команда ADC обычно используется для сложения 32-разрядных чисел.
Пример 1:
mov AX, 1125h
adc AX,2C25h ;AX=3D4B, если CF был = 1
SUB - Вычитание целых чисел
Команда SUB вычитает второй операнд (источник) из первого(приемника) и помещает результат на место первого операнда. Исходное значение первого операнда (уменьшаемое)теряется. Таким образом, если команду вычитания записать в общем виде: sub операнд_1, операнд_2
то ее действие можно условно изобразить следующим образом: операнд_ 1 - операнд_2 -> операнд_1
В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака.
Примеры:
sub CX, 5; выполняется действие СХ-5->
sub DH, DL; СХ выполняется действие DH-DL->DH
SBB - Целочисленное вычитание с заемом
Команда SBB вычитает второй операнд (источник) из первого (приемника). Результат замещает первый операнд, предыдущее значение которого теряется. Если установлен флаг CF, из результата вычитается еще 1. Таким образом, если команду вычитания записать в общем виде:
sbb операнд 1, операнд2
то ее действие можно условно изобразить следующим образом: операнд_1 - операнд_2 - CF -> операнд1
В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго-регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда SBB обычно используется для вычитания 32-разрядных чисел.
Пример :
mov AX, 76A5h
sbb AX, 76A3h ;AX=1, если CF был = 1 ;АХ=2, если CF был = О
IMUL — Умножение целых знаковых чисел
Команда IMUL выполняет умножение целого знакового числа, находящегося в регистре AL (в случае умножения на байт)или АХ (в случае умножения на слово), на операнд-источник (целое число со знаком). Размер произведения в два раза больше размера сомножителей.
Для однобайтовых операций один из сомножителей помещается в регистр AL; после выполнения операции произведение записывается в регистр АХ.Для двухбайтовых операций один из сомножителей помещается в регистр АХ; после выполнения операции произведение записывается в регистры DX и AX (в DX - старшая часть, в АХ - младшая).
В качестве операнда-сомножителя можно указывать регистр данных или ячейку памяти; не допускается умножение на непосредственное значение.
Пример :
mov AL, 5;Первый сомножитель
mov BL, 3;Второй сомножитель
imul BL ;AX=000Fh (произведение)
MUL - Умножение целых беззнаковых чисел Команда MUL выполняет умножение целого беззнакового числа, находящегося в регистре AL (в случае умножения на байт) или АХ (в случае умножения на слово), на операнд-источник (целое число без знака). Размер произведения в два раза больше размера сомножителей. Для однобайтовых операций один из сомножителей помещается в регистр AL; после выполнения операции произведение записывается в регистр АХ. Для двухбайтовых операций один из сомножителей помещается в регистр АХ; после выполнения операции произведение записывается в регистры DX и AX (в DX -старшая часть, в АХ - младшая). В качестве операнда-сомножителя можно указывать регистр данных или ячейку памяти; не допускается умножение на непосредственное значение.
Пример:
mov AL, 5 ;Первый сомножитель
mov BL, 3 ;Второй сомножитель
mulBL ;AX=000Fh (произведение)
IDIV - Деление целых знаковых чисел
Команда IDIV выполняет деление целого числа со знаком, находящегося в регистрах АХ (в случае деления на байт)или DX и AX (в случае деления на слово), на операнд-источник (целое число со знаком). Размер делимого в два раза больше размеров делителя и остатка. Оба результата рассматриваются как числа со знаком, причем знак остатка равен знаку делимого.
Для однобайтовых операций делимое помещается в регистр АХ; после выполнения операции частное записывается в регистр AL, a остаток - в регистр АН. Для двухбайтовых операций делимое помещается в регистры DX и AX(b DX – старшая часть, в АХ - младшая); после выполнения операции частное записывается в регистр АХ, а остаток - в регистр DX.
В качестве операнда-делителя можно указывать регистр данных или ячейку памяти; не допускается деление на непосредственное значение. Если делитель равен 0, или если частное не помещается в назначенный регистр, возбуждается прерывание через вектор 0.
Пример :
mov AX, 506 ;Делимое mov BL, 50 ;Делитель
div BL ;AL=0Ah (частое), AH=06h (остаток)
DIV - Деление целых без знаковых чисел Команда DIV выполняет деление целого числа без знака, находящегося в регистрах АХ (в случае деления на байт)или DX и AX (в случае деления на слово), на операнд-источник(целое число без знака). Размер делимого в два раза больше размеров делителя и остатка. Для однобайтовых операций делимое помещается в регистр АХ; после выполнения операции частное записывается в регистр AL, a остаток - в регистр АН.
Для двухбайтовых операций делимое помещается в регистры DX и AX (в DX - старшая часть, в АХ - младшая); после выполнения операции частное записывается в регистр АХ, а остаток - в регистр DX. В качестве операнда-делителя можно указывать регистр данных или ячейку памяти; не допускается деление на непосредственное значение. Если делитель равен 0, или если частное не помещается в назначенный регистр, возбуждается прерывание с вектором 0.
Пример:
mov AX, 506 ;Делимое mov BL, 50 ;Делитель
div BL ;AL=0Ah (частное), AH=06h (остаток)
INC - Инкремент (увеличение на 1)
Команда INC прибавляет 1 к операнду, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака.
Пример:
mov AX, 0563h inc AX ;AX=0564h
DEC - Декремент (уменьшение на 1)
Команда DEC вычитает 1 из операнда, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака. Пример 1:
mov AX, OFFFFh dec AX ;AX=FFFEh
DAA — Десятичная коррекция в регистре AL после :сложения
Команда DAA корректирует результат сложения в регистре AL двух упакованных десятичных чисел (по одной цифре в каждом полубайте), чтобы получить пару правильных упакованных десятичных цифр. Команда используется вслед за операцией сложения упакованных десятичных чисел. Если результат сложения превышает 99, возникает перенос и устанавливается флаг CF.
Пример:
mov AL, 87h ;Упакованное десятичное 87
add AL, 04h ;После сложения AL=8Bh
daa ;AL=91 h, т.е. упакованное
;десятичное 91
DAS - Десятичная коррекция в регистре AL после вычитания
Команда
DAS
корректирует результат вычитания в
регистре AL
двух упакованных десятичных чисел (по
одной цифре в каждом полубайте),
чтобы получить пару правильных упакованных
десятичных цифр.
Команда используется вслед за
операцией вычитания упакованных
десятичных чисел. Если для вычитания
требовался заем, устанавливается
флаг CF.
Пример:
mov AL, 55h ;Упакованное десятичное 55
sub AL, 19h ;После вычитания AL=3Ch
das ;AL=36h, т.е. упакованное
;десятичное 36
ААА - ASCII-коррекция регистра АХ после сложения Команда ААА используется вслед за операцией сложения в регистре AL двух распакованных двоично-десятичных чисел.
Она преобразует результат сложения в неупакованное двоично-десятичное число, младший десятичный разряд которого находится в AL. Если результат превышает 9, выполняется инкремент содержимого регистра АН.
Пример:
Mov AX, 0605h;
Двоично-десятичное65 add AL, 09h;
Двоично-десятичное9,
AX=060Eh ааа ;AX=0704h, двоично-десятичное 74
AAD - ASCII-коррекция регистра АХ перед делением Команда AAD используется перед операцией деления неупакованного двоично-десятичного числа в регистре АХ на другое двочно-десятичное число. Команда преобразует делимое в регистре АХ в беззнаковое двоичное число, чтобы в результате деления получились правильные неупакованные двоично-десятичные числа (частное в AL, остаток в АН).
Пример:
mov AX, 0207h ;Двоично-десятичное 27 mov DL, 06h ;Двоично-десятичное 6 aad ;AX=001B=27
div DL ;AX=0304, т.е. 4 и 3 в остатке
ААМ - ASCII-коррекция регистра АХ после умножения Команда ААМ используется вслед за операцией умножения двух неупакованных двоично-десятичных чисел. Она преобразует результат умножения, являющийся двоичным числом, в правильное неупакованное двоично-десятичное число, младший разряд, которого помешается в AL, а старший в АН.
Пример:
Mov AL, 08h ;Двоично-десятичное 8 mov CL, 07h ;Двоично-десятичное 7 mul CL ;AX=0038h=56
aam ;AX=0506h, двоично-десятичное 56
AAS - ASCII-коррекция регистра AL после вычитания
Команда AAS используется вслед за операцией вычитания одного неупакованного двоично-десятичного числа из другого в AL. Она преобразует результат вычитания в неупакованное двоично-десятичное число. Если результат вычитания оказывается меньше О, выполняется декремент содержимого регистра АН.
Пример:
mov AX, 0708b. ;Двоично-десятичное 78 mov CL, 09h ;Двоично-десятичное 9 sub AL, CL ;AX=07FFh, CF=1 aas ;AX=0609h, двоично-десятичное 69