我写了一个非常基本的C函数叫做“multby22”,它正如它的名字所暗示的那样:它需要很长的时间并且返回那么长的乘以22.(我知道这是一个没有意义的函数,但我把它写成了尝试帮助我进行x86组装。)所以:
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]
...第二个和第三个参数相乘,然后放入第一个参数,它必须是一个寄存器。在我生成的程序集中,第一个参数是常量!
答案 0 :(得分:9)
你找到了正确的指示。 AT&amp; T汇编语法恰好与其他人一样“倒退”。目的地寄存器在右侧。
您的代码将EAX乘以22(0x16)并将结果放入EAX。
如果您尝试将说明与文档进行比较,您应该查看可以输出Intel语法反汇编的反汇编程序。
答案 1 :(得分:1)
0x16 =十进制基数为22。编译器在那里用十六进制表示法编写它。 所以第一个将与第二个相乘并存储到第三个。