找到列表的中间值

时间:2015-06-14 20:56:49

标签: assembly x86

我无法弄清楚如何在具有偶数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,这肯定是不正确的。

2 个答案:

答案 0 :(得分:4)

不要DIV。请改用右移。

如果数字是无符号的,则进位标志包含溢出,因此请使用RCR。 否则SAR。如果速度是个问题,请检查清除进位标志和RCR的组合。

答案 1 :(得分:2)

问题可能与EDX有关,尽管您最初可能没有意识到这一点。 :)

在x86指令集中,DIV的大小由操作数决定,正如您所期望的那样。但是,通过使用DWORD PTR指定32位除法,处理器将自动尝试除以:EDX:EAX / DWORD [saTwo]EAX代表股息中最不重要的部分。如果EDX恰好具有相对较大的值,则结果商可能为零,余数位于EDX

您需要先清除EDX,然后再执行DIV