Команды преобразования типов данных

Как уже отмечалось выше, в арифметических командах размеры операндов должны быть согласованы.

Пусть, например, требуется сложить число, находящееся в регистре 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.