Ссылаясь на 3-746 Vol.2A мы видим, что используемая вами инструкция mul
:
F7 /4 MUL r/m32 Unsigned multiply (EDX:EAX ← EAX ∗ r/m32).
Другими словами eax
умножается на данный операнд (в данном случае ebx
), чтобы получить64-битный результат хранится в edx:eax
, то есть 32 старших разряда сохраняются в edx
, а 32 младших разряда в eax
.
Итак:
mov eax,3
mov ebx,2
mul ebx
Будетустановите edx:eax
в 6 = 00000000:00000006
, поэтому edx
очищается.
Стандартный способ сохранения регистров - поместить их в стек (push edx
), а затем восстановить их (pop edx
).).Поскольку в вашей программе не так много переменных, вы также можете использовать одну из подписанных инструкций умножения, для которых не требуются операнды и результат должен быть в edx
и eax
.
например
IMUL r32, r/m32, imm32 doubleword register ← r/m32 ∗ immediate doubleword.
Что позволяет сделать imul eax, eax, 3
для умножения eax
на 3.
Объедините это с @ ответом Пита Уилсона для фактического расчета значения.