mov Ax,260
mov Al,19
Регистр AL
является самой низкой половиной регистра AX
.
AX
/-----------------\
MSB xxxx xxxx xxxx xxxx LSB
\-------/ \-------/
AH AL
2-я инструкция mov al, 19
ошибочно перезаписывает ваш 1-й номер.
Mul Ax
Команда mul
размера байта умножает регистр AL
на указанный операнд размера байта.
Команда mul
размера слова умножает регистр AX
на указанный операнд размера слова.
Использование mul ax
тогда вычислит AX * AX
, а это не то, что вы хотели. Вы хотите умножить разные числа.
Использование AX
вместе с другим регистром, таким как BX
, решает обе проблемы.
Что делать с этим cbw
зависит от того, как мы смотрим на код.
Если вы работаете с числами как непосредственными (260, 19), то просто используйте регистр размером в слово даже для небольшого числа 19:
mov bx, 260
mov ax, 19
mul bx ; Product AX * BX is in DX:AX but here DX=0
PutInt ax
или даже пусть ассемблер сделает умножение:
mov ax, 260 * 19
PutInt ax
Если числа берутся из памяти (переменные разных размеров), вам нужно расширить меньшее.
Числа без знака, используйте mul
для Без знака , умножьте
mov bx, wNum ; [0,65535]
mov al, bNum ; [0,255]
mov ah, 0
mul bx ; Product AX * BX is in DX:AX
PutInt ax
Я рекомендую не использовать cbw
в этом случае! Использование cbw
приведет к повреждению всех чисел от 128 и выше.
Числа со знаком, используйте imul
для со знаком умножить
mov bx, wNum ; [-32768,32767]
mov al, bNum ; [-128,127]
cbw
imul bx ; Product AX * BX is in DX:AX
PutInt ax
cbw
- правильный выбор для расширения подписанного байта с AL
.