“CSAPP第三章阅读笔记”的版本间的差异

来自Dennis的知识库
跳转到: 导航搜索
第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输出:


个人工具
名字空间

变换
操作
导航
工具箱