Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 将Dword除以一个单词nasm_Assembly_X86_Nasm_Division_Extended Precision - Fatal编程技术网

Assembly 将Dword除以一个单词nasm

Assembly 将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

我试图对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  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