Изменение размера числа

Рассмотрим такую задачу. Пусть к числу из регистра ВХ надо прибавить число из регистра AL: BX:=BX+AL. Здесь требуется сложить слово с байтом, но в ПК нет команды сложения слова с байтом. Поэтому, прежде всего надо сделать равными размеры этих чисел, а именно: надо расширить байт AL до слова, записав его, скажем, в регистр АХ, и только затем сложить числа из регистров АХ и ВХ. Возникает вопрос: как расширить байт AL до слова АХ с сохранением, конечно, величины числа?

Если число трактуется как беззнаковое, то делается это просто - надо слева к числу приписать нули: например, если AL=32=20h, то AX=0020h. Реализуется это записью 0 в левую часть регистра АХ, т. е. в регистр АН:

MOV АН, 0 ; AL --> АХ (без знака)

Такое расширение называется расширением без знака.

Для чисел со знаком дело осложняется, т. к. надо учитывать знак числа. Если число неотрицательно, то для его расширения достаточно слева приписать нули. Но если число отрицательно, тогда слева надо приписывать двоичные единички (в шестнадцатеричной системе - две цифры F). К примеру, число -32 (-20h) в дополнительном коде как байт имеет вид 256-32 = 100h-20h = 0E0h, а как слово - 10000h-20h = 0FFE0h.

Итак, расширение знакового числа заключается в приписывании к нему слева нулей, если это число неотрицательно, или единичек, если число отрицательно. Такое расширение называется расширением со знаком.

Этому расширению можно дать и такую трактовку. Вспомним, что в дополнительном коде знакового числа самый левый бит является знаковым и что этот бит равен 0 для неотрицательных чисел и равен 1 для отрицательных. Поэтому можно сказать, что расширение со знаком заключается в дублировании слева знакового бита числа:

доп(+32) = 0010 0000b --> 0000 0000 0010 0000b

+

доп(-32) = 1110 0000b --> 1111 1111 1110 0000b

-

Для осуществления расширения со знаком в систему команд ПК введена специальная команда: