“CSAPP第三章阅读笔记”的版本间的差异
来自Dennis的知识库
Dennis zhuang(讨论 | 贡献) |
Dennis zhuang(讨论 | 贡献) |
||
第70行: | 第70行: | ||
</pre> | </pre> | ||
− | 也可以通过brew install binutils安装objdump, | + | 也可以通过brew install binutils安装objdump, gobjdump -M ATT -d 1(默认是intel格式)输出: |
<pre> | <pre> | ||
+ | 1: 文件格式 mach-o-x86-64 | ||
+ | |||
+ | Disassembly of section .text: | ||
+ | |||
+ | 0000000000000000 <_sum>: | ||
+ | 0: 55 push %rbp | ||
+ | 1: 48 89 e5 mov %rsp,%rbp | ||
+ | 4: 89 7d fc mov %edi,-0x4(%rbp) | ||
+ | 7: 89 75 f8 mov %esi,-0x8(%rbp) | ||
+ | a: 8b 75 fc mov -0x4(%rbp),%esi | ||
+ | d: 03 75 f8 add -0x8(%rbp),%esi | ||
+ | 10: 89 75 f4 mov %esi,-0xc(%rbp) | ||
+ | 13: 8b 75 f4 mov -0xc(%rbp),%esi | ||
+ | 16: 8b 3d 00 00 00 00 mov 0x0(%rip),%edi # 1c <_sum+0x1c> | ||
+ | 1c: 01 f7 add %esi,%edi | ||
+ | 1e: 89 3d 00 00 00 00 mov %edi,0x0(%rip) # 24 <_sum+0x24> | ||
+ | 24: 8b 45 f4 mov -0xc(%rbp),%eax | ||
+ | 27: 5d pop %rbp | ||
+ | 28: c3 retq | ||
+ | </pre> | ||
+ | |||
+ | 写入main.c下列代码: | ||
+ | |||
+ | <pre> | ||
+ | int sum(int, int); | ||
+ | int main(){ | ||
+ | return sum(1,3); | ||
+ | } | ||
+ | |||
+ | </pre> | ||
+ | |||
+ | 生成可执行文件gcc -o1 -o prog 1 main.c | ||
+ | gobjdump -M ATT -d prog的结果: | ||
+ | |||
+ | <pre> | ||
+ | 100000f30: 55 push %rbp | ||
+ | 100000f31: 48 89 e5 mov %rsp,%rbp | ||
+ | 100000f34: 89 7d fc mov %edi,-0x4(%rbp) | ||
+ | 100000f37: 89 75 f8 mov %esi,-0x8(%rbp) | ||
+ | 100000f3a: 8b 75 fc mov -0x4(%rbp),%esi | ||
+ | 100000f3d: 03 75 f8 add -0x8(%rbp),%esi | ||
+ | 100000f40: 89 75 f4 mov %esi,-0xc(%rbp) | ||
+ | 100000f43: 8b 75 f4 mov -0xc(%rbp),%esi | ||
+ | 100000f46: 8b 3d b4 00 00 00 mov 0xb4(%rip),%edi # 100001000 <_accum> | ||
+ | 100000f4c: 01 f7 add %esi,%edi | ||
+ | 100000f4e: 89 3d ac 00 00 00 mov %edi,0xac(%rip) # 100001000 <_accum> | ||
+ | 100000f54: 8b 45 f4 mov -0xc(%rbp),%eax | ||
+ | 100000f57: 5d pop %rbp | ||
</pre> | </pre> |
2014年4月16日 (三) 16:09的最后版本
一段代码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, gobjdump -M ATT -d 1(默认是intel格式)输出:
1: 文件格式 mach-o-x86-64 Disassembly of section .text: 0000000000000000 <_sum>: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: 89 7d fc mov %edi,-0x4(%rbp) 7: 89 75 f8 mov %esi,-0x8(%rbp) a: 8b 75 fc mov -0x4(%rbp),%esi d: 03 75 f8 add -0x8(%rbp),%esi 10: 89 75 f4 mov %esi,-0xc(%rbp) 13: 8b 75 f4 mov -0xc(%rbp),%esi 16: 8b 3d 00 00 00 00 mov 0x0(%rip),%edi # 1c <_sum+0x1c> 1c: 01 f7 add %esi,%edi 1e: 89 3d 00 00 00 00 mov %edi,0x0(%rip) # 24 <_sum+0x24> 24: 8b 45 f4 mov -0xc(%rbp),%eax 27: 5d pop %rbp 28: c3 retq
写入main.c下列代码:
int sum(int, int); int main(){ return sum(1,3); }
生成可执行文件gcc -o1 -o prog 1 main.c gobjdump -M ATT -d prog的结果:
100000f30: 55 push %rbp 100000f31: 48 89 e5 mov %rsp,%rbp 100000f34: 89 7d fc mov %edi,-0x4(%rbp) 100000f37: 89 75 f8 mov %esi,-0x8(%rbp) 100000f3a: 8b 75 fc mov -0x4(%rbp),%esi 100000f3d: 03 75 f8 add -0x8(%rbp),%esi 100000f40: 89 75 f4 mov %esi,-0xc(%rbp) 100000f43: 8b 75 f4 mov -0xc(%rbp),%esi 100000f46: 8b 3d b4 00 00 00 mov 0xb4(%rip),%edi # 100001000 <_accum> 100000f4c: 01 f7 add %esi,%edi 100000f4e: 89 3d ac 00 00 00 mov %edi,0xac(%rip) # 100001000 <_accum> 100000f54: 8b 45 f4 mov -0xc(%rbp),%eax 100000f57: 5d pop %rbp