CSAPP第三章阅读笔记
来自Dennis的知识库
2014年4月16日 (三) 15:41Dennis zhuang(讨论 | 贡献)的版本
一段代码code.c
int accum = 0; int sum(int x, int y) { int t = x + y; accum += t; return t; }
gcc -o1 -S code.c产生汇编代码(OSX Apple LLVM version 5.0 (clang-500.2.79)):
.section __TEXT,__text,regular,pure_instructions .globl _sum .align 4, 0x90 _sum: ## @sum .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 movl %edi, -4(%rbp) movl %esi, -8(%rbp) movl -4(%rbp), %esi addl -8(%rbp), %esi movl %esi, -12(%rbp) movl -12(%rbp), %esi movl _accum(%rip), %edi addl %esi, %edi movl %edi, _accum(%rip) movl -12(%rbp), %eax popq %rbp ret .cfi_endproc .globl _accum ## @accum .zerofill __DATA,__common,_accum,4,2 .subsections_via_symbols
gcc -o1 -c code.c生成目标代码文件1,使用hexdump -C 1查看二进制数据,通过otool -tV 1反汇编器查看:
(__TEXT,__text) section _sum: 0000000000000000 pushq %rbp 0000000000000001 movq %rsp, %rbp 0000000000000004 movl %edi, 0xfffffffffffffffc(%rbp) 0000000000000007 movl %esi, 0xfffffffffffffff8(%rbp) 000000000000000a movl 0xfffffffffffffffc(%rbp), %esi 000000000000000d addl 0xfffffffffffffff8(%rbp), %esi 0000000000000010 movl %esi, 0xfffffffffffffff4(%rbp) 0000000000000013 movl 0xfffffffffffffff4(%rbp), %esi 0000000000000016 movl _accum(%rip), %edi 000000000000001c addl %esi, %edi 000000000000001e movl %edi, _accum(%rip) 0000000000000024 movl 0xfffffffffffffff4(%rbp), %eax 0000000000000027 popq %rbp 0000000000000028 ret
也可以通过brew install binutils安装objdump, objdump -d 1输出: