2013-02-11 123 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以十进制为基数。编译器在那里用十六进制表示法编写它。 所以第一个将与第二个相乘并存储到第三个中。