Команды преобразования типов данных
Как уже отмечалось выше, в арифметических командах размеры операндов должны быть согласованы.
Пусть, например, требуется сложить число, находящееся в регистре BX (слово) с числом, которое находится в регистре AL (байт). Поскольку в командах сложения и вычитания операнды должны иметь одинаковый размер, необходимо число, находящееся в регистре AL расширить до слова и записать его, например, в регистр AX. Если мы имеем дело с числами без знака, либо с положительными числами со знаком, то для расширения такого числа достаточно к нему слева приписать незначащие нули (в данном примере выполнить команду MOV AH,00H). Для отрицательных чисел со знаком необходимо слева приписать единицы. Для изменения размера числа с учетом его знака и применяются команды преобразования типов данных (команды распространения знака).
Команда расширения байта до слова CBW (от англ. Convert Byte to Word – преобразовать байт в слово) преобразует байт, находящийся в регистре AL, в слово, находящееся в регистре AX, путем распространения значения старшего бита регистра AL на регистр AH. Сама команда операндов не имеет (местонахождение операнда и результата строго фиксировано).
Пример использования команды:
MOV AL,37
CBW ; В AX будет 0025H (+37 как слово)
MOV AL,-37
CBW ; В AX будет FFDBH (–37 как слово)
Для рассмотренного выше примера сложения байта и слова, фрагмент кода будет выглядеть следующим образом:
CBW
ADD BX,AX
При делении также возникает необходимость расширения слова до двойного слова. Команда CWD (от англ. Convert Word to Double word – преобразовать слово в двойное слово) преобразует слово, находящееся в регистре AX, в двойное слово, которое находится в паре регистров DX и AX путем распространения значения старшего бита регистра AX на регистр DX.
Например:
;Числа без знака
MOV BX,5B2EH
MOV DX,0000H
DIV BX
;Числа co знаком
CWD
IDIV BX
Вопросы для самопроверки
1. Определить значение флагов CF, OF, SF и ZF после выполнения арифметических операций:
MOV AX,4EF0H
ADD AL,3
ADD AH,95
2. Определить значение флагов CF, OF, SF и ZF после выполнения арифметических операций:
MOV AX,5А12H
SUB AL,23
SUB AH,-70
3. Написать фрагмент кода, который реализует нахождение куба беззнакового числа, значение которого хранится в регистре AL.
4. Какое значение будет находиться в регистре AX при выполнении данного фрагмента программы?
MOV AX,4EEBH
MOV BL,10H
MUL BL
5. Какое значение будет находиться в регистре AX при выполнении данного фрагмента программы?
MOV AX,3A9BH
MOV BL,185H
DIV BL
6. Напишите последовательность команд, в которой умножается 7 на -2, а результат записывается в 16-разрядную переменную otv.
7. Напишите последовательность команд, в которой складываются числа 15 и -21, а результат записывается в 8-разрядную переменную otv.