[英]Assembly How to translate IMUL opcode (with only one oprand) to C code
說我有
EDX = 0xA28
EAX = 0x0A280105
我運行此ASM代碼
IMUL EDX
據我了解,它僅使用EAX ..如果指定了一份指令
所以在C代碼中應該像
EAX *= EDX;
正確?
在調試器中查找后。我發現EDX
也發生了變化。
0x0A280105 * 0xA28 = 0x67264A5AC8
在調試器中
EAX = 264A5AC8
EDX = 00000067
現在,如果您采用答案0x67264A5AC8
並拆分出第一個十六進制對,即0x67 264A5AC8
您將清楚地看到EDX
和EAX
的樣子。
好的,所以發生溢出..因為它無法將如此龐大的數字存儲為32位。 因此它開始在EDX中使用額外的8位
但是我的問題是,現在我該如何用C代碼執行此操作以獲得相同的結果?
我猜這就像
EAX *= EDX;
EDX = 0xFFFFFFFF - EAX; //blah not good with math manipulation like this.
IMUL指令實際上產生的結果是操作數大小的兩倍(除非您使用可以指定目標的較新版本之一)。 所以:
imul 8bit -> result = ax, 16bits
imul 16bit -> result = dx:ax, 32bits
imul 32bit -> result = edx:eax, 64bits
在C中執行此操作將取決於編譯器,但是有些人可以這樣做:
long result = (long) eax * (long) edx;
eax = result & 0xffffffff;
edx = result >> 32;
假設long為64位。 如果編譯器沒有64位數據類型,則計算結果會變得困難得多,您需要進行長乘法。
您可以隨時內嵌imul指令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.