我正在使用運行時調試器。imul彙編指令 - 一個操作數?
EAX:0000 0023 EDX:5555 5556
imul edx
EAX:AAAA AAC2 EDX:0000 000B
我心亂如麻,無法弄清楚如何乘工作。這裏發生了什麼事?我在一個類似的question here是imul ebx ; result in EDX:EAX
注意到我不明白的EDX:EAX的符號,但:/
我正在使用運行時調試器。imul彙編指令 - 一個操作數?
EAX:0000 0023 EDX:5555 5556
imul edx
EAX:AAAA AAC2 EDX:0000 000B
我心亂如麻,無法弄清楚如何乘工作。這裏發生了什麼事?我在一個類似的question here是imul ebx ; result in EDX:EAX
注意到我不明白的EDX:EAX的符號,但:/
當imul
的一個操作數形式傳遞一個32位的參數(如你的情況與EDX
)這實際上意味着EAX * EDX
其中EAX
和EDX
都是32位寄存器。
兩個32位值的乘積不一定適合32位:完整的乘法結果最多可能需要64位。答案的高32位將寫入EDX
寄存器,低32位寫入EAX
寄存器;這是用EDX:EAX
表示法表示的。
如果只希望結果的低32位,使用的imul
2操作數形式;它運行得更快,並且沒有任何隱式操作數(所以你可以使用任何最方便的寄存器)。
imul ecx, esi
確實ecx *= esi
像你期望的那樣,沒有觸及EAX
或EDX
。它就像C,其中unsigned x=...;
x *= y;
與輸入的結果具有相同的寬度。
imul
也有一個直接的形式:imul ecx, ebx, 1234
確實ecx = ebx * 1234
。對於imul ecx, ecx, 1234
,許多彙編程序將接受imul ecx, 1234
作爲簡寫。
imul
工作的32×32這些=> 32位的形式正確地對符號或無符號;一個操作數mul
和imul
的結果僅在上半部分(EDX
)中不同,而不是輸出的低半部分EAX
。
當寄給'imul'的寄存器是'eax'時會發生什麼?它仍然做同樣的事情嗎?如果你給它的東西不是'eax'或'edx',比如'eax'? – 2013-05-04 23:35:44
imul指令有很多種形式。採用單個32位參數(內存或寄存器)的表單總是返回EDX:EAX對中的結果。 – 2013-05-05 12:38:35