Учитывая, что вы используете 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
).