我無法搞清楚如何找到的有一個甚至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,這肯定是不正確的。
我無法搞清楚如何找到的有一個甚至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,這肯定是不正確的。
麻煩很可能與EDX
做雖然你可能沒有意識到它。 :)
在x86指令集的DIV
的大小由操作數決定的,如你所願。但是,通過指定DWORD PTR
的32位分頻,處理器將自動嘗試分割,如下所示:EDX:EAX/DWORD [saTwo]
。 EAX
代表股息中最不重要的部分。如果EDX碰巧有一個相對較大的值,那麼得到的商可能爲零,其餘的座標爲EDX
。
您將要清除EDX
,然後再執行您DIV
謝謝你解決它我明白我的錯誤! – Teragon
不要DIV。改用右移。
如果數字是無符號,進位標誌包含溢出,所以使用RCR。 否則SAR。如果速度有問題,請檢查清除進位標誌和RCR的組合。
儘管在我們打開您的問題後我們可以看到它:請在標籤中指定您正在討論的是哪種彙編程序。我敢打賭,有一個x86標籤可用,並添加這一個肯定會使ARM的傢伙高興;-) – Marged