Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛабАсм09.doc
Скачиваний:
19
Добавлен:
29.08.2019
Размер:
159.74 Кб
Скачать
  1. Дополнительные команды

а) Команда сравнения

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, а операнд остается без изменения.

  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 (разобрать самостоятельно).

  1. Команды преобразования длины

Эти команды используются перед делением, флаги – не модифицируют.

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.

Следует осторожно использовать константы, описанные в Паскале, т.к. в некоторых командах языка Ассемблера существуют ограничения на типы операндов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]