Как получить значение продукта после умножения значений двух регистров? - PullRequest
0 голосов
/ 01 ноября 2018

Так скажем, регистры ax = 50 и cx = 1000

после выполнения

mul cx

шестнадцатеричное произведение будет разделено пополам в виде (dx ax) Как я могу получить всю стоимость продукта? (50 000 в этом случае)

1 Ответ

0 голосов
/ 02 ноября 2018

Учитывая, что вы используете irvine32 , вы способны писать 32-битный код.
Больше нет смысла программировать 16-битную версию в 2018 году. 32-битный код был введен в 1985 году, теперь вы должны двигаться дальше.

Это, как говорится.

mov ax,[a]       //part a
mov cx,[b]       //part b
mul cx         //ax:dx = a * b
cmp dx,0       //if dx=0 then ax contains the whole result
jne overflow   //handle overflow
//process ax

Если вы присоединитесь к миру здравомыслящих людей, вы можете просто сделать

movzx eax, word ptr [a]
movzx ecx, word ptr [b]
imul eax,ecx              //eax=eax*ecx
//test to see if it fits into a word
cmp eax,0xFFFF
ja,overflow               //result does not fit into a word.
//or, test to see if it fits into a (signed) int
js,overflow

Если вы собираетесь сохранить результат в unsigned int, вам не нужно его проверять.

Поскольку ваши входные данные являются положительными 16-разрядными, выходные данные никогда не могут переполнить 32-разрядное целое число без знака. Еще одно преимущество imul заключается в том, что , если вы используете версию с двумя операндами, она не заглушает регистр edx.

См .: IMUL

'Как я могу получить все значение [...]? (50 000 [...] '
ax - это 16-битный регистр, , если вы используете его как беззнаковое слово, тогда оно может содержать значения от 0 до 65535. Поскольку назначение вычисления - dx:ax, биты знака входят в dx.
НО, mul - это кратное число без знака, поэтому не следует передавать ему отрицательные значения.
Если вы хотите умножить со знаком, используйте imul.
Вы также можете использовать imul для умножения без знака при условии, что самые значимые биты ваших двух входов равны нулю. (это то, что делает movzx).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...