Разделите меч словом 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 обнулить верхнюю половину.

Другие вопросы по тегам