Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архитектура компьютеров / 6_Доп программы.doc
Скачиваний:
44
Добавлен:
20.03.2015
Размер:
164.35 Кб
Скачать

Беззнаковое деление: команда div

Команда DIV делит беззнаковые числа. На рис. 4.28 в процедуре D10DIV дано четыре примера деления:

  1. слова на байт,

  2. байта на байт,

  3. двойного слова на слово и

  4. слова на слово.

Первый пример команды DIV делит 2000Н (8092) 80H (128). В результате остаток 00 получается в регистре АН, а частное 40H (64) - в регистре AL.

Во втором примере команды DIV выполняется прежде расширение байта BYTE1 до размеров слова. Так как здесь предполагается беззнаковая величина, то в примере левый бит регистра АН равен нулю. В результате деления остаток - 12Н получается в регистре АН, а частное 05Н - в регистре AL.

Третий пример команды DIV генерирует остаток 1000Н в регистре DX и частное 0080Н в регистре AX.

В четвертом примере команды DIV сначала выполняется расширение слова WORD1 до двойного слова в регистровой паре DX:AX. После деления остаток 0000Н получится в регистре DX, а частное 0002Н - в регистре AX.

Знаковое деление: команда idiv

Команда IDIV (Integer DIVide) выполняет деление знаковых чисел. На рис. 4.28 в процедуре E101DIV используются те же четыре примера деления, что и в процедуре D10DIV, но вместо команд DIV записаны команды IDIV. Первый пример команды IDIV делит 2000Н (положительное число) на 80H (отрицательное число). Остаток от деления 00Н получается в регистре АН , а частное -0С0Н (-64) - в регистре AL. Команда DIV, используя те же числа, генерирует частное + 64.

Шестнадцатиричные результаты трех остальных примеров деления приведены ниже:

Пример команды IDIV

Остаток Частное

2 ЕЕ (-18) FB (-5)

3 1000 (4096) 0080 (128)

4 0000 0002

Только в примере 4 вырабатывается такой же результат, как и для команды DIV.

Таким образом, если делимое и делитель имеют одинаковый знаковый бит, то команды DIV и IDIV генерируют одинаковый результат. Но если делимое и делитель имеют разные знаковые биты, то команда DIV генерирует положительное частное, а команда IDIV - отрицательное частное. Можно обнаружить это, используя трассировку этих примеров.

TITLE EXDIV (СОM) Пример операций DIV и IDIV

CODESG SEGMENT PARA 'Code'

ORG 100H

BEGIN: JMP SHORT MAIN

;

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

BYTE2 DB 16H

WORD1 DW 2000Н

WORD2 DW 0010H

WORD3 DW 1000H

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

CALL D10DIV ;Вызов п/п DIV

CALL E101DIV ;Вызов п/п IDIV

MAIN ENDP

; Примеры с командой DIV:

;

D10DIV PROC

MOV AX,WORD1 ;Слово / байт

DIV BYTE1 ;ост:частное в AH: AL

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

SUB АН,АН ;расшир.делимое в АН

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:

E101DIV PROC

MOV AX, WORD1 ;Слово / байт

IDIV BYTE1 ;ост:частное в AH: AL

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

CBW ;расшир.делимое в АН

IDIV BYTE3 ;ост:чартное в AH: AL

MOV DX,WORD2 ;Двойное слово / слово

MOV AX, WORD3 ;делимое в DX:AX

IDIV WORD1 ;ост:частное в DX:AX

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

CWD ;расшир.делимое в DX

IDIV WORD3 ;ост:частное в DX:AX RET

E10DIV ENDP

CODESG ENDS

END BEGIN

Рис. 4.28. Беззнаковое и знаковое деление

Повышение производительности.

При делении на степень числа 2 (2, 4 и т.д.) более эффективен сдвиг вправо на требуемое количество битов. В следующих примерах предположим, что делимое находится в регистре AX:

Деление на 2:

SHR AX,1

Деление на 8:

MOV CL.3

SHR AX,CL

Соседние файлы в папке Архитектура компьютеров