2010-09-29 141 views
10

我正在使用運行時調試器。imul彙編指令 - 一個操作數?

EAX:0000 0023 EDX:5555 5556

imul edx 

EAX:AAAA AAC2 EDX:0000 000B

我心亂如麻,無法弄清楚如何乘工作。這裏發生了什麼事?我在一個類似的question hereimul ebx ; result in EDX:EAX注意到我不明白的EDX:EAX的符號,但:/

回答

21

imul的一個操作數形式傳遞一個32位的參數(如你的情況與EDX)這實際上意味着EAX * EDX其中EAXEDX都是32位寄存器。

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


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

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

imul也有一個直接的形式:imul ecx, ebx, 1234確實ecx = ebx * 1234。對於imul ecx, ecx, 1234,許多彙編程序將接受imul ecx, 1234作爲簡寫。


imul工作的32×32這些=> 32位的形式正確地對符號或無符號;一個操作數mulimul的結果僅在上半部分(EDX)中不同,而不是輸出的低半部分EAX

請參閱Intel's instruction reference manual entry for imul

+0

當寄給'imul'的寄存器是'eax'時會發生什麼?它仍然做同樣的事情嗎?如果你給它的東西不是'eax'或'edx',比如'eax'? – 2013-05-04 23:35:44

+2

imul指令有很多種形式。採用單個32位參數(內存或寄存器)的表單總是返回EDX:EAX對中的結果。 – 2013-05-05 12:38:35