我已经写了一个非常基本的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