源代码
程序代码:
#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 编辑 ]