Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абель.docx
Скачиваний:
13
Добавлен:
26.11.2018
Размер:
569.84 Кб
Скачать

31323334 Имеет распакованное десятичное представление 01020304. Кроме

этого, надо помнить, что коррекция осуществляется только для одного байта

за одно выполнение, поэтому можно умножать только oдно-байтовые поля; для

более длинных полей необходима организация цикла.

Команда AAM делит содержимое регистра AL на 10 (шест.0A) и записывает

частное в регистр AH, а остаток в AL. Предположим, что в регистре AL

содержится шест.35, а в регистре CL - шест.39. Следующие команды умножают

содержимое регистра AL на содержимое CL и преобразуют результат в

ASCII-формат:

AX:

AND CL,0FH ;Преобразовать CL в 09

AND AL,0FH ;Преобразовать AL в 05 0005

MUL CL ;Умножить AL на CL 002D

AAM ;Преобразовать в распак.дес. 0405

OR AX,3030H ;Преобразовать в ASCII-ф-т 3435

Команда MUL генерирует 45 (шест.002D) в регистре AX, после чего команда

AAM делит это значение на 10, записывая частное 04 в регистр AH и остаток

05 В регистр al. Команда or преобpазует затем распакованное десятичное

число в ASCII-формат.

Пример на рис.13.2 демонстрирует умножение четырехбайтового множимого

на однобайтовый множитель. Так как команда AAM может иметь дело только с

однобайтовыми числами, то в программе организован цикл, который

обрабатывает байты справа налево. Окончательный результат умножения в

данном примере - 0108090105.

Если множитель больше одного байта, то необходимо обеспечить еще один

цикл, который обрабатывает множитель. В этом случае проще будет

преобразовать число из ASCII-формата в двоичный формат (см. следующий

раздел "Преобразование ASCII-формата в двоичный формат").

__________________________________________________________________________

TITLE ASCMUL (COM) Умножение ASCII-чисел

CODESG SEGMENT PARA 'Code'

ASSUME CS:CODESG,DS:CODESG,SS:CODESG

ORG 100H

BEGIN: JMP MAIN

; ---------------------------------------------

MULTCND DB '3783' ;Элементы данных

MULTPLR DB '5'

PRODUCT DB 5 DUP(0)

; ---------------------------------------------

MAIN PROC NEAR

MOV CX,04 ;4 цикла

LEA SI,MULTCND+3

LEA DI,PRODUCT+4

AND MULTPLR,0FH ;Удалить ASCII-тройку

A20:

MOV AL,[SI] ;Загрузить ASCII-символ

; (можно LODSB)

AND AL,OFH ;Удалить ASCII-тройку

MUL MULTPLR ;Умножить

AAM ;Коррекция для ASCII

ADD AL,[DI] ;Сложить с

AAA ; записанным

MOV [DI],AL ; произведением

DEC DI

MOV [DI],AH ;Записать перенос

DEC SI

LOOP A20 ;Циклиться 4 раза

RET

MAIN ENDP

CODESG ENDS

END BEGIN

__________________________________________________________________________

Рис.13.2. Умножение в ASCII-формате.

Деление в ASCII-формате

-------------------------

Команда AAD (ASCII Adjust for Division - коррекция для деления

ASCII-кодов) выполняет корректировку ASCII-кода делимого до

непосредственного деления. Однако, прежде необходимо очистить левые тройки

ASCII-кодов для получения распакованного десятичного формата. Команда AAD

может оперировать с двухбайтовыми делимыми в регистре AX. Предположим, что

регистр AX содержит делимое 3238 в ASCII-формате и регистр CL содержит

делитель 37 также в ASCII-формате. Следующие команды выполняют коррекцию

для последующего деления:

AX:

AND CL,0FH ;Преобразовать CL в распак.дес.

AND AX,0F0FH ;Преобразовать AX в распак.дес. 0208

AAD ;Преобразовать в двоичный 001C

DIV CL ;Разделить на 7 0004

Команда AAD умножает содержимое AH на 10 (шест.0A), прибавляет pезультат