源代码
程序代码:
#include<stdio.h>
int fun(int);
int main(int argc, char** argv)
{
int i=2, r;
r = fun(i=i+3);
printf("i=%d,r=%d\n", i, r);
return 0;
}
int fun(int a)
{
return a;
}
汇编指令
程序代码:
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 4, 0x90
_main: ## @main
.cfi_startproc
## BB#0:
pushq %rbp
Ltmp2:
.cfi_def_cfa_offset 16
Ltmp3:
.cfi_offset %rbp, -16
movq %rsp, %rbp
Ltmp4:
.cfi_def_cfa_register %rbp
subq $32, %rsp
movl $0, -4(%rbp)
movl %edi, -8(%rbp)
movq %rsi, -16(%rbp)
movl $2, -20(%rbp) # i=2,为啥是确定-20是i变量?可以通过计算算出来~不过这里看代码也能猜出...
movl -20(%rbp), %edi # 将变量i放入寄存器edi
addl $3, %edi # 寄存器edi的值加3
movl %edi, -20(%rbp) # 将寄存器edi的值重新赋予变量i,此时i=5
callq _fun # 这里,才开始调用fun函数
leaq L_.str(%rip), %rdi
movl %eax, -24(%rbp)
movl -20(%rbp), %esi
movl -24(%rbp), %edx
movb $0, %al
callq _printf
movl $0, %edx
movl %eax, -28(%rbp) ## 4-byte Spill
movl %edx, %eax
addq $32, %rsp
popq %rbp
ret
.cfi_endproc
.globl _fun
.align 4, 0x90
_fun: ## @fun
.cfi_startproc
## BB#0:
pushq %rbp
Ltmp7:
.cfi_def_cfa_offset 16
Ltmp8:
.cfi_offset %rbp, -16
movq %rsp, %rbp
Ltmp9:
.cfi_def_cfa_register %rbp
movl %edi, -4(%rbp)
movl -4(%rbp), %eax
popq %rbp
ret
.cfi_endproc
.section __TEXT,__cstring,cstring_literals
L_.str: ## @.str
.asciz "i=%d,r=%d\n"
.subsections_via_symbols
结论,在调用方法之前,就已经加好了~虽然C语言的书上已经说得很明白,但我这里还是比较蛋疼的列出汇编指令,目的也是希望楼主能举一反三~
[ 本帖最后由 神vLinux飘飘 于 2014-1-11 23:38 编辑 ]









