- •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 Преобразование знака
4.13 Особенности арифметических операций c двоичными данными.
В этом разделе даются примеры программ с операциями сложения, вычитания, умножения и деления двоичных данных.
4.13.1 Сложение и вычитание
Команды ADD и SUB выполняют сложение и вычитание байтов или слов, содержащих двоичные данные. Вычитание осуществляется в компьютере по методу сложения с двоичным дополнением: для второго операнда устанавливаются обратные значения битов и прибавляется 1, а затем происходит сложение с первым операндом. Во всем, кроме первого шага, операции сложения и вычитания идентичны.
На рис. 4.24 представлены примеры команд ADD и SUB, обрабатывающих байты или слова. В процедуре B10ADD используется команда ADD для сложения байтов, а в процедуре C10SUB команда SUB вычитает слова. Примеры показывают все пять возможных ситуаций:
сложение/вычитание регистр - регистр;
сложение/вычитание память - регистр;
сложение/вычитание регистр - память;
сложение/вычитание регистр - непосредственное значение;
сложение/вычитание память - непосредственное значение.
.CODE
ORG 100H
BEGIN: JMP SHORT MAIN
.DATA
BYTEA DB 64Н ;Элементы данных
BYTEB DB 40H
BYTEC DB 16H
WORDA DW 4000H
WORDB DW 2000H
UORDC DW 1000H
MAIN PROC NEAR ;Основная процедура:
CALL B10ADD ;Вызвать сложение ADD
CALL C10SUB ;Вызвать вычитание SUB
RET
MAIN END
; Пример сложения байт:
B10ADD: PUSH AX ;Сохранение регистров
PUSH BX
MOV AL,BYTEA
MOV BL,BYTEB
ADD AL,BL ;Регистр и регистр
ADD AL,BYTEC ;Память и регистр
ADD BYTEA,AL ;Регистр и память
ADD BL,10H ;Непосредств.и регистр
ADD BYTEC,25H ;Непосредств.и память RET
ADD BYTEB,AL ;Регистр и память
POP AX
POP BX
RET
; Пример вычитания слов:
C10SUB: PUSH AX
PUSH BX
MOV AX,WORDA
MOV BX.WORDB
SUB AX,BX ;Регистр из регистра
SUB AX,WORDC ;Память из регистра
SUB BX, 1000H ;Непосредств. из peг.
SUB WORDA, BX ;Регистр из памяти
SUB WORDA,256H ;Непосредств. из пам.
POP AX
POP BX
RET
Рис. 4.24. Примеры команд ADD и SUB
Поскольку прямой операции память-память не существует, то данная операция выполняется через регистр. В следующем примере к содержимому слова WORDB прибавляется содержимое слова WORDA, описанные как DW:
MOV AX,WORDA
ADD AX,WORDB
MOV WORDB,AX
Переполнения
Опасайтесь переполнений в арифметических операциях. Один байт содержит знаковый бит и семь битов данных, т.е. значения от -128 до + 127. Результат арифметической операции может легко превзойти емкость однобайтового регистра. Например, результат сложения в регистре AL, превышающий его емкость, автоматически не переходит в регистр АН. Предположим, что регистр AL содержит 60Н, тогда команда
ADD AL, 20H
генерирует в AL сумму - 80Н. Но операция также устанавливает флаг переполнения и знаковый флаг в состояние "отрицательно". Причина заключается в том, что 80H или двоичное 1000 0000 является отрицательным числом. Таким образом, вместо + 128 сумма равна -128. Так как регистр AL слишком мал для такой операции, следует воспользоваться регистром AX. В следующем примере команда CBW (Convert Byte to Word - преобразовать байт в слово) преобразует 60Н в регистре AL в 0060Н в регистре AX, передавая при этом знаковый бит (0) через регистр АН. Команда ADD генерирует теперь в регистре AX правильный результат: 0080Н, или +128:
CBW ; Расширение AL до AX
ADD AX, 20Н ;Прибавить к AX
Но полное слово имеет также ограничение: один знаковый бит и 15 бит данных, что соответствует значениям от -32768 до + 32767. Рассмотрим далее, как можно обрабатывать числа, превышающие эти пределы.