Расширение байта до слова(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, если число отрицательно. Для этого в системе команд ПК есть специальная команда: