Предположим, я хочу умножить большое число на другое (возможно, маленькое) число в ассемблере. Большое число (множимое) сохраняется в DX:AX
, а множитель сохраняется в BX
. Инструкция MUL
работает только с AX
. Так что же делать с DX
?
Например, число 0001:0000H
(65536), и я хочу умножить его на 2.
number dw 0000h, 0001h
...
mov ax, [number]
mov dx, [number+2]
mov bx, 2
mul bx ; it is ax*2 or 0000*2
Поэтому результат нулевой! Есть идеи по этому поводу?
ax
содержит адрес0000
, а не значение. Вероятно, вы хотели сделатьmov ax,[number]
иmov dx,[number+2]
(+2, потому чтоdw
— это 2 байта). - person Ped7g   schedule 28.10.2016mul
противimul
) - person Ped7g   schedule 28.10.2016fild dword [a]
,fimul dword [b]
/fistp qword [result]
должны помочь, по крайней мере, если ваши входные данные представляют собой целые числа со знаком. 80-битный внутренний формат x87 может точно представлять каждое 64-битное целое число со знаком, поэтому этот результат должен быть точным. Я не проверял, что 8087 поддерживает 64-битные целочисленные хранилища, но определенно не требует x86-64. (gcc использует FILD/FISTP для 64-битной атомарной загрузки/сохранения в 32-битном режиме.) - person Peter Cordes   schedule 29.10.2016