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

来自Dennis的知识库
跳转到: 导航搜索
 
第70行: 第70行:
 
</pre>
 
</pre>
  
也可以通过brew install binutils安装objdump, objdump -d 1输出:
+
也可以通过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
个人工具
名字空间

变换
操作
导航
工具箱