“CSAPP第三章阅读笔记”的版本间的差异
来自Dennis的知识库
Dennis zhuang(讨论 | 贡献) |
Dennis zhuang(讨论 | 贡献) |
||
第10行: | 第10行: | ||
return t; | return t; | ||
} | } | ||
+ | </pre> | ||
+ | |||
+ | gcc -o1 -S code.c产生汇编代码(OSX Apple LLVM version 5.0 (clang-500.2.79)): | ||
+ | |||
+ | <pre> | ||
+ | .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 | ||
+ | </pre> | ||
+ | |||
+ | gcc -o1 -c code.c生成目标代码文件1,使用hexdump -C 1查看二进制数据,通过otool -tV 1反汇编器查看: | ||
+ | |||
+ | <pre> | ||
+ | (__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 | ||
+ | </pre> | ||
+ | |||
+ | 也可以通过brew install binutils安装objdump, objdump -d 1输出: | ||
+ | |||
+ | <pre> | ||
+ | |||
</pre> | </pre> |
2014年4月16日 (三) 15:41的版本
一段代码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输出: