Умножение

3.1. Запишите в текстовом редакторе NORTON программу exmult1.asm в СОМ-формате:

.286

TITLE EXMULT1 (COM) Пример команд умножения

CODESG SEGMENT PARA 'Code'

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

ORG 100H ;Начало в конце PSP

BEGIN: JMP SHORT MAIN ;Обход через данные

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

BYTE1 DB 80H ;Элементы данных

BYTE2 DB 40H

WORD1 DW 8000H

WORD2 DW 4000H

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

MAIN PROC NEAR ;Основная процедура

CALL C10MUL ;Вызвать умнож. MUL

CALL D10IMUL ;Вызвать умнож. IMUL

RET

MAIN ENDP

; Пример умножения MUL

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

C10MUL PROC

MOV AL,BYTE1 ;Байт * байт

MUL BYTE2 ;Произведение в АХ

MOV AX,WORD1 ;Слово * слово

MUL WORD2 ;Произведение в DX:AX

MOV AL,BYTE1 ;Байт * слово

SUB AH,AH ;Расш. множ. в АН

MUL WORD1 ;Произведение в DX:AX

RET

C10MUL ENDP

; Пример умножения IMUL

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

D10IMUL PROC

MOV AL,BYTE1 ;Байт * байт

IMUL BYTE2 ;Произведение в АХ

MOV AX,WORD1 ;Слово * слово

IMUL WORD2 ;Произведение в DX:AX

MOV AL,BYTE1 ;Байт * слово

CBW ;Расшир. множ. в АН

IMUL WORD1 ;Произвед. в DX:AX

RET

D10IMUL ENDP

CODESG ENDS

END BEGIN

В процедуре C10MUL дано три примера умножения: байт на байт, слово на слово и слово на байт. Первый пример команды MUL перемножает 80Н (128) на 40Н (64). Произведение 2000Н (8192) получается в регистре АХ.

Второй пример команды MUL генерирует 2000 0000Н в регистрах DX:AX.

Третий пример команды MUL перемножает слово на байт и требует расширения байта BYTE1 до размеров слова. Для расширения используется команда SUB, обнуляющая регистр АН. Произведение 0040 0000Н получается в регистровой паре DX:AX.

В процедуре D10IMUL используются те же три примера умножения, что и в процедуре C10MUL, но вместо команд MUL записаны команды IMUL.

Первый пример команды IMUL перемножает 80Н (отрицательное число) на 40Н (положительное число). Произведение Е000 получается в регистре АХ. Команда IMUL рассматривает 80Н как -128. В результате умножения -128 на +64 получается -8192 или шестнадцатиричное Е000.

Второй пример команды IMUL перемножает 8000Н (отрицательное значение) на 2000Н (положительное значение). Произведение Е000 0000 получается в регистрах DX:AX и представляет собой отрицательное значение.

Третий пример команды IMUL перед умножением выполняет расширение байта BYTE1 до размеров слова в регистре АХ. Так как значения предполагаются знаковые, то в примере используется команда CBW для перевода левого знакового бита в регистр АН: шестнадцатиричное 80 в регистре AL превращается в FF80 в регистре АХ. Поскольку множитель в слове WORD1 имеет также отрицательное значение, то

произведение будет положительным.

3.2. Выполнить ассемблирование и компоновку программы. Записать листинг программы в отчет. Вызвать отладчик DEBUG на выполнение программы.

3.3. Просмотреть сегмент кодов с помощью команды D CS:100 и определить в каких ячейках памяти записаны элементы данных программы. Выполнить трассировку программы, записывая выводы в отчет о выполнении каждой команды.

Наши рекомендации