簡體   English   中英

imul匯編指令 - 一個操作數?

[英]imul assembly instruction - one operand?

我正在使用運行時調試器。

EAX:0000 0023 EDX:5555 5556

imul edx

EAX:aaaa aac2 EDX:0000 000b

我完全糊塗了,無法弄清楚這種倍增是如何起作用的。 這里發生了什么事? 我在這里的類似問題中注意到imul ebx ; result in EDX:EAX imul ebx ; result in EDX:EAX我不明白EDX:EAX表示法雖然:/

imul的單操作數形式傳遞32位參數時(如在EDX的情況下),它實際上意味着EAX * EDX ,其中EAXEDX都是32位寄存器。

兩個32位值的乘積不一定適合32位:完全乘法結果最多可能需要64位。 應答的高32位將寫入EDX寄存器,低32位寫入EAX寄存器; 這用EDX:EAX表示EDX:EAX表示法。


如果您只想要結果的低32位,請使用imul的2操作數形式; 它運行得更快,並且沒有任何隱式操作數(因此您可以使用最方便的寄存器)。

imul ecx, esiecx *= esi就像你期望的那樣,沒有觸及EAXEDX 它就像C,其中unsigned x=...; x *= y; 結果的寬度與輸入相同。

imul也有一個直接的形式: imul ecx, ebx, 1234ecx = ebx * 1234 許多裝配工將接受imul ecx, 1234作為imul ecx, ecx, 1234


這些32x32 => 32位形式的imul可以正確地用於有符號或無符號; 單操作數mulimul僅在上半部分(在EDX )不同,而不是低半部分EAX輸出。

有關imul請參閱英特爾的說明參考手冊

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM