x86程序集中“imul”指令的不熟悉语法

时间:2013-02-11 16:46:02

标签: c assembly x86

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

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

2 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:1)

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

相关问题