- •4.13 Особенности арифметических операций c двоичными данными.
- •Многословное сложение
- •Word1a 0123
- •Буззнаковые и знаковые данные
- •Беззнаковое Знаковое
- •4.13.2 Умножение
- •ДоАн alПослеAx
- •Знаковое умножение: команда imul
- •C10mul endp
- •Многословноe умножение
- •Сдвиг влево на 4 бита
- •4.13.3 Деление
- •До ax После ан al
- •Беззнаковое деление: команда div
- •Знаковое деление: команда idiv
- •Переполнения и прерывания
- •Деление вычитанием
- •4.13.4 Преобразование знака
Беззнаковое деление: команда div
Команда DIV делит беззнаковые числа. На рис. 4.28 в процедуре D10DIV дано четыре примера деления:
слова на байт,
байта на байт,
двойного слова на слово и
слова на слово.
Первый пример команды 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