在C语言中,“b ++”的集合是什么。
我有两种情况:

1)一条指令

     addl    $0x1,-4(%rbp)

2)三个指令
        movl    -4(%rbp), %eax
        leal    1(%rax), %edx
        movl    %edx, -4(%rbp)

这两种情况是由编译器引起的吗?

我的代码:
int main()
{
    int ret = 0;
    int i = 2;

    ret = i++;
    ret = ++i;
    return ret;
}

.s文件(++ i使用addl指令,i ++使用其他):
        .file   "main.c"
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movl    $0, -8(%rbp)   //ret
        movl    $2, -4(%rbp)   //i
        movl    -4(%rbp), %eax
        leal    1(%rax), %edx
        movl    %edx, -4(%rbp)
        movl    %eax, -8(%rbp)
        addl    $1, -4(%rbp)
        movl    -4(%rbp), %eax
        movl    %eax, -8(%rbp)
        movl    -8(%rbp), %eax
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (Ubuntu 5.3.1-14ubuntu2) 5.3.1 20160413"
        .section        .note.GNU-stack,"",@progbits

最佳答案

ISO标准完全不要求幕后情况。它指定了一个“虚拟机”,它根据您提供给它的 C 指令以某种方式起作用。

因此,如果您的C编译器被实现为C到达特茅斯基本转换器,那么b++与其他代码一样可能导致10 let b = b + 1 :-)

如果要编译为通用的汇编代码,则可能会发现差异,具体取决于是否使用结果,尤其是b++;a = b++,因为前者的结果可以安全地丢弃。

您还可能会看到基于优化级别的巨大差异。

最重要的是,没有指定所有可能影响输出的内容(包括但不限于编译器,目标平台和优化级别)。

关于c - “b++”的汇编,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51400775/

10-11 08:44