Деление
7.1. Запишите в текстовом редакторе NORTON программу exdiv.asm в СОМ-формате:
.286
TITLE EXDIV (COM) Пример операций DIV и IDIV
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 16H
WORD1 DW 2000H
WORD2 DW 0010H
WORD3 DW 1000H
;--------------------------------------------------------
MAIN PROC NEAR ;Основная процедура
CALL D10DIV ;Вызов п/п DIV
CALL E10IDIV ;Вызов п/п IDIV
CALL F10SHR ;Вызов п/п SHR
RET
MAIN ENDP
; Примеры с командой DIV
; ----------------------
D10DIV PROC
MOV AX,WORD1 ;Слово / байт
DIV BYTE1 ;ост:частное в AH:AL
MOV AL,BYTE1 ;Байт / байт
SUB AH,AH ;расшир. делимое а АН
DIV BYTE2 ;ост:частное в AH:AL
MOV DX,WORD2 ;Двойное слово / слово
MOV AX,WORD3 ;делимое в DX:AX
DIV WORD1 ;ост:частное в DX:AX
MOV AX,WORD1 ;Слово / слово
SUB DX,DX ;расшир. делимое в DX
DIV WORD3 ;ост:частное в DX:AX
RET
D10DIV ENDP
; Пример с командой IDIV
; ----------------------
E10IDIV PROC
MOV AX,WORD1 ;Слово / байт
IDIV BYTE1 ;ост:частное в AH:AL
MOV AL,BYTE1 ;Байт / байт
CBW ;расшир. делимое в АН
IDIV BYTE2 ;сот:частное в AH:AL
MOV DX,WORD2 ;Двойное слово / слово
MOV AX,WORD3 ;Делимое в DX:AX
IDIV WORD1 ;ост:частное в DX:AX
MOV AX,WORD1 ;Слово / слово
CWD ;расшир. делимое в DX
IDIV WORD3 ;ост:частное в DX:AX
RET
E10IDIV ENDP
; Пример деления на степень
; -------------------------
F10SHR PROC
MOV AX,256
SHR AX,1 ;Деление на 2
MOV CL,3
SHR AX,CL ;Деление на 8
RET
F10SHR ENDP
CODESG ENDS
END BEGIN
В процедуре D10DIV дано четыре примера деления: слова на байт, байта на байт, двойного слова на слово и слова на слово. Первый пример команды DIV делит 2000Н (8092) на 80Н (128). В результате остаток 00 получается в регистре АН, а частное 40Н (64) - в регистре AL.
Во втором примере команды DIV выполняется прежде расширение байта BYTE1 до размеров слова. Так как здесь предполагается беззнаковая величина, то в примере левый бит регистра АН равен нулю. В результате деления остаток - 12Н получается в регистре АН, а частное 05Н - в регистре AL.
Третий пример команды DIV генерирует остаток 1000Н в регистре DX и частное 0080Н в регистре АХ.
В четвертом примере команды DIV сначала выполняется расширение слова WORD1 до двойного слова в регистровой паре DX:AX. После деления остаток 0000Н получится в регистре DX, а частное 0002Н – в регистре АХ.
В процедуре E10IDIV используются те же четыре примера деления, что и в процедуре D10DIV, но вместо команд DIV записаны команды IDIV. Первый пример команды IDIV делит 2000Н (положительное число) на 80Н (отрицательное число). Остаток деления 00Н получается в регистре АН, а частное - С0 (-64) - в регистре AL.
Шестнадцатиричные результаты трех остальных примеров деления следующие:
Пример команды IDIV Остаток Частное
2 ЕЕ (-18) FB (-5)
3 1000 (4096) 0080 (128)
4 0000 0002
Процедура F10SHR показывает пример деления на степень числа 2 (2,4 и т.д.).
7.2. Выполнить ассемблирование и компоновку программы. Записать листинг программы в отчет. Вызвать отладчик DEBUG на выполнение программы.
7.3. Выполнить трассировку программы внимательно отслеживая содержимое регистров AX и DX. Выводы о работе программы записать в отчет.