- •Московский авиационный институт
- •(Государственный технический университет)
- •“ Язык ассемблера ibm pc ”
- •Лабораторные работы
- •Указания по работе с турбо-ассемблером
- •Лабораторная работа № 1
- •Команды сложения и вычитания
- •Дополнительные команды
- •Команды умножения и деления
- •Команды преобразования длины
- •Задание
- •Лабораторная работа № 2
- •Близкие и далекие переходы.
- •Задание
- •Лабораторная работа № 3
- •Структура программы на языке Ассемблера
- •Описание процедур
- •Вызов процедур
- •Задание
- •Лабораторная работа № 4 Задание
Дополнительные команды
а) Команда сравнения
CMP op 1, op 2; op 1 - op2
Результат нигде не запоминается.
Цель команды – модификация флагов: ZF, SF,PF,CF,AF,OF.
б) Команда изменения знака
NEG op
Операнд может быть байт или слово в регистре или в ячейке памяти.
Пример,
MOV AH, 12
NEG AH ; AH := -12
Если операнд равен нулю, то его значение не изменяется.
Команда модифицирует флаги аналогично п.(а), причем
CF=1, кроме случая, когда операнд равен нулю;
OF=0, кроме случая, когда op=-128 (для 1Б), тогда OF=1, а операнд остается без изменения.
Команды умножения и деления
а) Умножение
MUL op ; умножение целых чисел без знака
I MUL op; умножение целых чисел со знаком
Операнд может быть слово или байт в регистре или в ячейке памяти, но не непосредственный операнд.
Команды действуют одинаково:
- для байтов AX := AL*op
- для слов (DX,AX) := AX*op
Команда имеет один операнд, а второй операнд находится в аккумуляторе (подразумеваемая адресация).
Т.к. результат получается удвоенной разрядности относительно сомножителей, то при умножении слов он располагается в стандартной паре регистров (DX,AX), причем DX хранит старшие разряды.
Команды модифицируют флаги:
СF=OF=0 , если старшая половина результата AH нулевая или совпадает по знакам.
СF=OF=1 , если старшие разряды не нулевые.
б) Деление
DIV op; деление целых чисел без знака
IDIV op; деление целых чисел со знаковом
где op – аналогично умножению.
Команды выполняют деление нацело и формируют два результата: целое частное и остаток.
Деление слова на байт выполняется по схеме
АН:=АХ mod op (остаток)
AL:=AX div op (частное)
Деление двойного слова на слово
DX := (DX,AX) mod op
AX := (DX,AX) div op
Делимое заранее должно быть размещено в аккумуляторе и сдвинуто в сторону младшего байта в АХ или AL соответственно.
Флаги не модифицируются, но может возникнуть ошибка «деление на ноль или переполнение», которая возникает, если делитель нулевой или частное не помещается в соответствующее ему место.
При появлении этой ошибки микропроцессор прекращает выполнение программы.
в) Команды десятичной коррекции после команд умножения AAM и перед командой деления AAD (разобрать самостоятельно).
Команды преобразования длины
Эти команды используются перед делением, флаги – не модифицируют.
CBW
– преобразует байт со знаком в AL, в слово со знаком в АХ путем распространения старшего бита AL по всем разрядам AH;
CWD
– преобразует слово в АХ в двойное слово в (DX,AX).
Программирование линейных арифметических участков программ
Наибольшие проблемы в программировании на языке Ассемблера возникают при вводе и выводе информации на экран монитора и другие внешние устройства. В связи с этим изучение основных команд языка Ассемблера целесообразно начинать с включения фрагментов программы на языке Ассемблера в программу на языке Турбо-Паскаль. Причем описание переменных, присваивание начальных значений и вывод результатов выполняются на Паскале, а арифметические преобразования – на языке Ассемблера. Пример совмещения языков программирования приведен ниже.
program as;
uses crt;
var a,b,c,d: integer;
begin
a:=47;
b:=29;
c:=-54;
d:=21;
{*далее вставка фрагмента на ЯА *}
asm
mov ax,a
mov cx,d
div cl
mov al,ah
mov ah,0
mov b,ax
mov ax,c
imul d
add b,ax
mov ax,a
imul a
sub ax,27
add b,ax
end;
{* далее продолжение программы на Паскале *}
writeln ('результат=',b:4);
end.
Следует осторожно использовать константы, описанные в Паскале, т.к. в некоторых командах языка Ассемблера существуют ограничения на типы операндов.