Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 181

Unknown Author

ASCII-коррекция перед делением (ASCII adjust before division): AAD

Эта команда ставится после команды, которая в регистре АХ получает пару неупакованных цифр делимого (в АН - старшая цифра, в AL - младшая). Команда AAD преобразует эту пару цифр в двоичное число, записывая его в регистр АХ: AX:=10*AH+AL. После этого уже можно делить обычным образом (по команде DIV) это число на делитель из одной десятичной цифры. Например:

MOV вн,9 MOV AX,0307h AAD

DIV ВН

;делитель

;делимое 37 (АН-3, AL=7)

; AX=25h (37 как двоичное число)

;АН=1 (37 mod 9), AL=4 (37 div 9)

В качестве примера рассмотрим деление N-значного неупакованного двоичнодесятичного числа X на однозначное число Y с записью неполного частного от деления в Q, а остатка - в R.

Предлагается следующий алгоритм. Пусть надо разделить Х=746 на Y=3. БереМ 0 и первую цифру (7) числа X и делим это двузначное число (07) на Y; неполное частное (2) записываем в начало Q, а к остатку (1) присоединяем следующую цифру (4) числа X. Полученное двузначное число (14) делим на Y, после чего неполное частное (4) записываем в Q, а к остатку (2) присоединяем последнюю цифру (6) из X. Разделив двузначное число 26 на Y, неполное частное (8) записываем в Q, а остаток (2) - в переменную R.

N EQU ...

X DB N DUP(?) Y DB ?

Q DB N DUP(?) R DB ?

;деление неупакованного MOV CX,N MOV SI,0 MOV АН,0 DV: MOV AL,X[SI]

;N>0

•от 0 до 9 ;место для X div Y ;место для X mod Y 2-10-го числа X на десятичную цифру Y ;количество цифр в X ;индекс цифры из X (слева направо)

;АН - остаток от деления старших цифр ;AL - очередная цифра из X

АХ=двоичное число из цифр АН и AL ’ деление: АН-остаток, AL=неполное частное запись неполного частного в Z

AAD DIV Y

MOV Q[SI],AL INC SI LOOP DV MOV R,AH

остаток от деления X на Y

14.2* Дополнительные команды ПК

Здесь вкратце перечислены команды ПК, которые не были рассмотрены в предыдущих главах. Это либо команды, которые достаточно редко используются на практике, либо команды, которые применяются в ситуациях, не рассматриваемых в данной книге (например, при взаимодействии центрального процессора с арифметическим сопроцессором).

Загрузка флагов в регистр АН (load АН from Flags): LAHF Чтение флагов из регистра АН (save АН into Flags): SAHF

Команда LAHF записывает в регистр АН правую половину регистра флагов Flags, а команда SAHF записывает содержимое АН в правую половину регистра Flags.

Эти команды введены для совместимости с процессором 8080 (предшественником процессора 8086) и практически не используются.

Очистка флага переноса (clear carry flag): CLC Установка флага переноса (set carry flag): STC Изменение флага переноса (complement carry flag): CMC

По команде CLC флаг CF обнуляется (CF:=0), по команде STC флаг CF получает значение 1 (CF:=1), а по команде CMC значение флага CF меняется на противоположное (CF:=1-CF). Остальные флаги не меняются.    .»

Эти команды могут использоваться перед командами циклического сдвига RCL и RCR для установки нужного значения флага CF перед сдвигом. Кроме того, поскольку с помощью этих команд значение флага CF можно менять достаточно просто, то флаг CF иногда используется для фиксации того, выполнено или нет некоторое условие; например, процедура может этим флагом сообщить, успешно она проработала или нет.