Разделите меч словом nasm
Я пытаюсь сделать подписанный раздел меча в DX:AX
скажем, 1234567 со словом [b]=10.
a dd 1234567
b dw 10
mov ax,[a]
mov dx,[a+2]
idiv word [b]
Коэффициент должен быть 123456, но он слишком велик, чтобы не помещаться в топор. Что я должен сделать, чтобы решить эту проблему?
1 ответ
Очевидно, у вас есть 32-битный размер операнда, так что используйте его не только idiv dword [b]
(который читает за пределами 16-битной b
и, следовательно, не может быть правым).
mov eax, [a]
cdq
mov ecx, 10 ; or movsx ecx, word [b] to load with sign-extension
idiv ecx
Вы положили все a
в eax
как обычно для любой другой 32-битной операции. Затем вы используете деление 64b / 32b => 32b с тривиальной верхней половиной дивиденда (знак или ноль).
cdq
знак расширяется eax
в edx:eax
, Чтобы настроить для div
вместо idiv
использовать xor edx,edx
обнулить верхнюю половину.