簡體   English   中英

匯編如何將IMUL操作碼(只有一個操作數)轉換為C代碼

[英]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您將清楚地看到EDXEAX的樣子。

好的,所以發生溢出..因為它無法將如此龐大的數字存儲為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.

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