это правильный способ использовать cbw в Mul? - PullRequest
2 голосов
/ 12 апреля 2019

Я получаю Умножение из 8-битного и 8-битного регистра.Но когда у вас есть одно в 16-битном и одно в 8-битном, как мы выполняем преобразование перед умножением:

Вопрос: необходимо предоставить фрагменты кода для 260 * 19 и распечатать результаты.Я сделал:

mov Ax,260
mov Al,19
cbw;
Mul Ax 
PutInt Ax

1 Ответ

1 голос
/ 16 апреля 2019
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.

...