Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭВМ практические.docx
Скачиваний:
101
Добавлен:
11.04.2015
Размер:
275.2 Кб
Скачать

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

Рассмотрим такую задачу. Пусть к числу из регистра ВХ надо прибавить число из регистра 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

-

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

Расширение байта до слова (convert byte to word): CBW

У этой команды местонахождение операнда и результата фиксировано: операнд всегда берется из AL, а результат всегда записывается в АХ. Команда записывает в регистр АН число 00h или 0FFh в зависимости от знака числа из регистра AL:

Флаги эта команда не меняет.

Примеры:

MOV AL, 32 ; AL=20h

CBW ; AX=0020h (число +32 как слово)

MOV АL, -32 ; AL=0E0h

CBW ; AX=0FFE0h (число -32 как слово)

Теперь вернемся к нашей задаче - к сложению BX:=BX+AL. В зависимости от того, как трактуются числа - как беззнаковые или как знаковые, она решается следующим образом:

; числа без знака:

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

ADD ВХ, АХ

; числа со знаком:

CBW ; AL -> АХ (расширение со знаком)

ADD BX, AX

Необходимость расширения байта до слова чаще всего возникает при делении байтов. Напомним, что в ПК можно делить слово на байт, но не байт на байт, поэтому, если мы хотим все же разделить байт на байт, то нам прежде всего надо первый байт (делимое) расширить до слова. А как это делается, мы только что рассмотрели. Например, присваивание AL:=AL div CH реализуется так:

; числа без знака:

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

DIV CH ; AL:=AX div CH (АН:=АХ mod CH)

; числа со знаком:

CBW ; AL -> АХ (со знаком)

IDIV CH ; AL:=A div CH (АН:=АХ mod CH)

Мы рассмотрели случай расширения байта до слова. Аналогично осуществляется расширение слова до двойного слова, необходимость в котором также возникает при делении. Обычно приходится расширять слово, находящееся в регистре АХ, до двойного слова, занимающего два регистра - DX и АХ, при условии, что в DX находится старшая часть числа, а в АХ - младшая:

АХ --> (DX, AX)

При этом условии расширение беззнакового числа АХ реализуется засылкой 0 в регистр DX:

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

Если же число АХ рассматривается как знаковое, тогда для его расширения надо в регистр DX записать 0000h, если число неотрицательно, или 0FFFFh, если число отрицательно. Для этого в системе команд ПК есть специальная команда:

Расширение слова до двойного (convert word to double): CWD

Действие этой команды можно описать так: