在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/