我已經寫了一個非常基本的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]
...其中第二和第三個參數相乘,然後放置到第一個參數,它必須是一個寄存器。在我生成的程序集中,第一個參數是一個常量!
對於這種類型的asm語法(AT&T),dest reg是最後一個。 – nhahtdh 2013-02-11 16:47:27
閱讀英特爾與AT&T彙編語法辯論。 – 2013-02-11 16:56:28
如果你編譯時有一些優化,那麼大多數額外的工具將會消失。你的代碼不需要堆棧。極有可能的是,乘以22也會變成乘以5的序列,然後乘以2,加上原始值並乘以2.我認爲這將是三條指令 - 它們一起比多條指令快。 – 2013-02-11 17:32:18