Assembly 将Dword除以一个单词nasm
我试图对DX:AX中的一个双字进行符号除法,比如1234567,其中一个字[b]=10Assembly 将Dword除以一个单词nasm,assembly,x86,nasm,division,extended-precision,Assembly,X86,Nasm,Division,Extended Precision,我试图对DX:AX中的一个双字进行符号除法,比如1234567,其中一个字[b]=10 a dd 1234567 b dw 10 mov ax,[a] mov dx,[a+2] idiv word [b] 商应该是123456,但它太大了,所以不适合放在ax中。我应该怎么做才能解决这个问题呢?显然,您有32位操作数大小可用,因此使用它不仅仅是idiv dword[b],它读取16位b之外的数据,因此不可能是正确的 mov eax, [a] cdq mov ecx, 10 ; or
a dd 1234567
b dw 10
mov ax,[a]
mov dx,[a+2]
idiv word [b]
商应该是123456,但它太大了,所以不适合放在ax中。我应该怎么做才能解决这个问题呢?显然,您有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除法,除法中有一个简单的除法符号上半部分或零扩展
干熄焦标志将eax扩展为edx:eax。要设置div而不是idiv,请使用xor edx,edx将上半部分归零。如果可用,请使用64位除法。否则,你自己实现它。所以我应该把dword转换成qword,把单词转换成dword,然后进行符号除法?是的,这就是我的想法。@Jester所以我这样做了:mov ax,[b];化学武器;mov[e],ax;动产增值税[a];mov-dx[a+2];干熄焦;伊迪夫·德沃德[e]。但这只是将eax除以[e],因为考虑edx=0.mov eax,[a]/cdq/mov ecx,10/idiv ecx。如果有可用的32位操作数大小,则可以像通常用于任何其他32位操作一样,将所有操作数放入eax。然后使用64b/32b=>32b除法,除法的上半部分=0。干熄焦标志将eax扩展为edx:eax。要设置div而不是idiv,请使用xor edx、edx