- •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 Преобразование знака
ДоАн alПослеAx
умножения: Множимое Множитель умножения: произведение
Умножение слова на слово. Множимое находится в регистре EAX, а множитель - в слове памяти или в регистре. После умножения произведение образуется в двойном слове, для которого требуется два регистра: старшая (левая) часть произведения находится в регистре EDX, а младшая (правая) часть - в регистре EAX. Операция игнорирует и стирает любые данные, которые были в регистре EDX.
До | EAX | ПослеEDXEAX
умножения: |Множимое | умножения: Старшая Младшая
часть часть
Произведение
Если множитель находится в регистре, то длина регистра определяет тип операции, как показано ниже:
MUL CL ;Байт-множитель: множимое в AL, произведение в AX
MUL BX ;Слово-Множитель: множимое в AX, произведение в DX:AX
MUL EBX ;Двойное слово-Множитель: множимое в EAX, произведение в EDX:EAX
Беззнаковое умножение: команда MUL
Команда MUL (MULtiplication - умножение) перемножает беззнаковые числа. На рис. 4.26 в процедуре C10MUL дано три примера умножения: байт на байт, слово на слово и слово на байт.
Первый пример команды MUL перемножает 80Н (128) на 47Н (64). Произведение 2000Н (8192) получается в регистре AX.
Второй пример команды MUL генерирует 10000000Н в регистрах DX:AX.
Третий пример команды MUL перемножает слово на байт и требует расширения байта BYTE1 до размеров слова. Так как предполагаются беззнаковые данные, то в примере левый бит регистра АН равен нулю. (При использовании команды CBW значение левого бита регистра AL может быть 0 или 1.) Произведение 00400000Н получается в регистровой паре DX:AX.
Знаковое умножение: команда imul
Команда IMUL (Integer MULtiplication - умножение целых чисел) перемножает знаковые числа. На рис. 4.26 в процедуре D10IMUL используются те же три примера умножения, что и в процедуре C10MUL, но вместо команд MUL записаны команды IMUL.
page 60,132
TITLE EXMULT (СОМ) Пример команд умножения
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG
ORG 100H
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 ;произведение в AX
MOV AX,WORD1 ;Слово * слово
MUL WORD2 ;произведение в DX:AX
MOV AX,WORD1 ;Слово * слово
MUL AX,WORD2 ; !!! произведение в EAX
MOV AL, BYTE1 ;Байт * слово
SUB АН, АН . ;расшир.множимого. в АН
MUL WORD1 ;произведение в DX:AX
RET