2013-02-11 93 views
4

我已經寫了一個非常基本的C函數叫做「multby22」,它的名字意味着它的確切含義:它需要很長的時間並返回長乘以22.(我知道這是一個毫無意義的功能,但我寫的嘗試和幫助我的x86彙編)所以:在x86彙編中的「imul」指令的不熟悉的語法

long multby22(long x) { 
    return 22 * x; 
} 

當我遵循的程序,並運行「objdump的」關於可執行文件,我發現了反彙編代碼爲「 multby22「爲以下內容:

080483ff <multby22>: 
    80483ff:  55     push %ebp    
    8048400:  89 e5     mov %esp,%ebp   // Create the stack frame. 
    8048402:  8b 45 08    mov 0x8(%ebp),%eax // Grab the argument and put it into the %eax register. 
    8048405:  6b c0 16    imul $0x16,%eax,%eax // ??? 
    8048408:  5d     pop %ebp    // Pop the buffer pointer and return. 
    8048409:  c3     ret 

我知道」imul「是整數倍數但是我一直無法找到任何可以幫助我使用這種語法的東西!我發現的最接近的是:

imul [reg] [reg] [const] 

...其中第二和第三個參數相乘,然後放置到第一個參數,它必須是一個寄存器。在我生成的程序集中,第一個參數是一個常量!

+6

對於這種類型的asm語法(AT&T),dest reg是最後一個。 – nhahtdh 2013-02-11 16:47:27

+2

閱讀英特爾與AT&T彙編語法辯論。 – 2013-02-11 16:56:28

+0

如果你編譯時有一些優化,那麼大多數額外的工具將會消失。你的代碼不需要堆棧。極有可能的是,乘以22也會變成乘以5的序列,然後乘以2,加上原始值並乘以2.我認爲這將是三條指令 - 它們一起比多條指令快。 – 2013-02-11 17:32:18

回答

7

您找到了正確的說明。 T彙編語法恰好是其他人所做的「倒退」。目的地寄存器在右邊。

您的代碼將EAX乘以22(0x16)並將結果放入EAX。

如果您試圖將指令與文檔進行比較,您應該查看可以輸出英特爾語法反彙編的反彙編程序。

1

0x16 = 22以十進制爲基數。編譯器在那裏用十六進制表示法編寫它。 所以第一個將與第二個相乘並存儲到第三個中。