5

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

...其中第二个和第三个参数相乘,然后放入第一个参数,它必须是一个寄存器。在我生成的程序集中,第一个参数是一个常数!

4

2 回答 2

9

你找到了正确的指示。AT&T 汇编语法恰好与其他人的做法“倒退”。目标寄存器在右侧。

您的代码将 EAX 乘以 22 (0x16) 并将结果放入 EAX。

如果您尝试将说明与文档进行比较,您可能应该查看可以输出 Intel 语法反汇编的反汇编程序。

于 2013-02-11T16:48:44.970 回答
1

0x16 = 22(十进制)。编译器在那里以十六进制表示法编写它。所以第一个将与第二个相乘并存储到第三个中。

于 2013-02-11T16:51:13.353 回答