一个简单的汇编程序分析

最近打算跟一下这门mooc课程. 刚完成了第一周的内容. mindmup内容开源如下:

这里使用跟linux内核一样的AT&T汇编语法.

AT&T 汇编语法注意事项

简单的C源程序

/*
 * @file main.c
 * @author Akagi201
 * @date 2015/03/01
 *
 * A simple code to learn how assembly code works.
 * build on linux x64: gcc -S -o main.s main.c -m32
 */

int g(int x) {
  return x + 3;
}

int f(int x) {
  return g(x);
}

int main (void) {
  return f(8) + 1;
}

Linux x64平台汇编命令

asm

g:
	pushl	%ebp
	movl	%esp, %ebp
	movl	8(%ebp), %eax # eax = 8
	addl	$3, %eax # eax = 8 + 3 = 11
	popl	%ebp
	ret

f:
	pushl	%ebp
	movl	%esp, %ebp # 每个函数前两句都是这个, 用于保存上一个堆栈的栈顶, 跟清空出一个新的堆栈
	subl	$4, %esp
	movl	8(%ebp), %eax # eax = 8
	movl	%eax, (%esp) # 把8放到栈顶
	call	g # 跳到g标号
	leave
	ret

main:
	pushl	%ebp # 将当前ebp的值压栈, 同时esp的值被修改(即减4)
	movl	%esp, %ebp # 将ebp指向esp
	subl	$4, %esp # 将esp向下移动一个位置
	movl	$8, (%esp) # 将立即数8赋值给esp指向的位置(即当前的栈顶)
	call	f # 等价于两条语句 pushl eip; movl f eip => 当前eip实际指向addl $1, %eax这条指令, 跳转到f标号处执行
	addl	$1, %eax # eax = 11 + 1 = 12
	leave
	ret # 最终ebp, esp回到main函数最初的栈的位置.

备注