Деление

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. Выводы о работе программы записать в отчет.

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