我无法弄清楚如何在具有偶数50个数字的双字列表中找到中间值。当我尝试按如下方式实现我的代码时
mov eax, dword[volumes+100]
add eax, dword[volumes+104]
div dword[saTwo]
mov dword[vMid], eax
其中卷100和104是列表中的第25和第26个元素。然后我除以2并将中间值存储在vMid中。当我调试程序时出现问题vMid为0,这肯定是不正确的。
答案 0 :(得分:4)
不要DIV。请改用右移。
如果数字是无符号的,则进位标志包含溢出,因此请使用RCR。 否则SAR。如果速度是个问题,请检查清除进位标志和RCR的组合。
答案 1 :(得分:2)
问题可能与EDX
有关,尽管您最初可能没有意识到这一点。 :)
在x86指令集中,DIV
的大小由操作数决定,正如您所期望的那样。但是,通过使用DWORD PTR
指定32位除法,处理器将自动尝试除以:EDX:EAX / DWORD [saTwo]
。 EAX
代表股息中最不重要的部分。如果EDX恰好具有相对较大的值,则结果商可能为零,余数位于EDX
。
您需要先清除EDX
,然后再执行DIV