Умножение ассемблера - PullRequest
       16

Умножение ассемблера

0 голосов
/ 11 октября 2011

возникли проблемы с пониманием умножения сборок. Может ли кто-нибудь помочь сломать процесс этих шагов:

mov  ax,[p1000]; p1000 = +1000    ax = 03e8
imul [n100];     n100 = -100
                 _____________
                      -100,000

dx:ax = fffe 7960   (dx = fffe, ax = 7960) cf = 1

Я не уверен, как сделать вывод, что ответ -100,000 из dx: ax. Я пытался вычислить это так:

дх = (15 * 16 ^ 3) + (15 * 16 ^ 2) + (15 * 16) + 14 = 65 534
топор = (7 * 16 ^ 3) + (9 * 16 ^ 2) + (6 * 16) = 31 072
дх + топор = 96 606

Возможно, я подхожу к этому неправильно, поэтому, пожалуйста, поправьте меня, если я ошибаюсь.

Ответы [ 2 ]

1 голос
/ 11 октября 2011
imul [n100]; 

умножит и оставит результат в dx: ax

Теперь, dx: ax = fffe 7960. Это 32-битная величина с верхними 16 битами в dx и нижними 16 битами в ax. Поскольку MSB этого общего 32-битного со знаком количества равен 1, это отрицательное число, и нам нужен комплимент двоих, чтобы найти величину.

FFFE 7960 <-- our number
0001 869F <-- 1's compliment in hex
0001 86A0 <-- 2's compliment in hex
...0001 1000 0110 1010 0000 <-- 2's compliment in binary

Преобразовать это в десятичное число, как обычно (сумма всех) (1 * 2 ^ {bit_position}) ... мы получаем величину как ..

100000.

Теперь вспомните, что это отрицательное число со знаком (MSB = 1), поэтому, сложив знак и величину, мы получим ... -100,000:)

1 голос
/ 11 октября 2011

В кодировке дополнения до двух 0xfffe:7960 (отрицательное число, поскольку для старшего бита установлено значение 1) равно -(0x1:0000:0000-0xfffe:7960) или -0x1:86a0, что соответствует -100,000 в десятичном виде.* не не добавляйте вместе 16-битные регистры ax и dx, чтобы получить значение, вы рассматриваете их как одно 32-битное значение.

...