我编写了一个非常基本的 C 函数,称为“multby22”,它的功能正是它的名字所暗示的:它需要一个 long 并返回 long 乘以 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]
...其中第二个和第三个参数相乘,然后放入第一个参数,它必须是一个寄存器。在我生成的程序集中,第一个参数是一个常数!