Умножение
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 и определить в каких ячейках памяти записаны элементы данных программы. Выполнить трассировку программы, записывая выводы в отчет о выполнении каждой команды.