首页 > 解决方案 > `leal (%rdi,%rdi), %eax` 有什么作用?

问题描述

#include <stdio.h>

int f(int x) {
    return x * FACTOR;
}
int main() {
    int x=1;
    printf("%d\n", f(x));
    return 0;
}

对于上面的程序,如果我用clang -g -S -DFACTOR=2. 我得到以下输出。

似乎以下两条指令与乘法有关x * 2。但我不明白他们如何计算乘法。有人可以帮忙解释一下吗?谢谢。

    leal    (%rdi,%rdi), %eax
...
    movl    $2, %esi
...
Ltmp0:
    ##DEBUG_VALUE: f:x <- $edi
    .loc    1 6 11 prologue_end     ## main.c:6:11
    leal    (%rdi,%rdi), %eax
    .loc    1 6 2 is_stmt 0         ## main.c:6:2
    popq    %rbp
    retq
...
Ltmp2:
    ##DEBUG_VALUE: main:x <- 1
    .loc    1 10 2 prologue_end     ## main.c:10:2
    leaq    L_.str(%rip), %rdi
    movl    $2, %esi
    xorl    %eax, %eax
    callq   _printf
    .loc    1 11 2                  ## main.c:11:2
    xorl    %eax, %eax
    popq    %rbp
    retq

标签: assemblyx86att

解决方案


推荐阅读