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输出:


个人工具
名字空间

变换
操作
导航
工具箱