瞬息万变的指令系统

计算机通过连续执行每一条的机器语句而实现工作。为了能够更加明了地分析计算机的工作,以下从一个C语言程序的反汇编代码来说明...

UglyYouth
, in 08 March 2015

此文仅用于MOOCLinux内核分析作业

张依依+原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

以下为正文

计算机通过连续执行每一条的机器语句而实现工作。主要进行该工作的核心硬件是CPU,从某个角度来说, CPU即一个集成电路,实现的功能就是某个位置读出一个指令,从某一个位置读出数据,然后根据指令的不同对数据做不同的处理,然后把结果存回某个地方。

反汇编过程

为了能够更加明了地分析计算机的工作,以下从一个C语言程序的反汇编代码来说明:


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

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

int main(void)
{
  return f(3) + 2;
}
通过gcc –S –o main.s main.c -m32命令实现
通过gcc –S –o main.s main.c -m32命令实现
VI中查看
VI中查看
通过把不相关的语句删除后的反汇编程序
通过把不相关的语句删除后的反汇编程序

反汇编程序分析

g:
	pushl	%ebp
	movl	%esp, %ebp
	movl	8(%ebp), %eax
	addl	$7, %eax
	popl	%ebp
	ret
f:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$4, %esp
	movl	8(%ebp), %eax
	movl	%eax, (%esp)
	call	g
	leave
	ret
main:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$4, %esp
	movl	$3, (%esp)
	call	f
	addl	$2, %eax
	leave
	ret

至此堆栈的情况如下:

标号 指向标号的寄存器
0
1 ebp ebp->标号0
2 3
3 esp eip->`addl $2,%eax`语句

至此堆栈的情况如下:

标号 指向标号的寄存器 值(eax->10)
0
1 ebp->标号0
2 3
3 EIP->`addl $2,%eax`语句
4 ebp->`标号1`
5 3
6 eip->`leave`
7 ebp,esp ebp->`标号4`

至此堆栈的情况如下:

标号 指向标号的寄存器 值(eax->10)
0
1 ebp ebp->标号0
2 3
3 esp EIP->`addl $2,%eax`语句
最终寄存器的情况
ebp指向标号0
esp指向标号0
eax中最后结果12 |

总结

正如开头所说,计算机是通过连续执行每一条的机器语句而实现工作的。

计算机中执行指令系统主要依靠寄存器以及内存的代码段数据段等的结合,并通过堆栈实现。

站在纯计算机的角度来说,实际上就是一条又一条指令的实现;而站在高级编程语言的角度上, 在函数之间互相调用的过程中,是通过在调用函数前向堆栈中压入当前环境的重要变量实现保护现场的。 这种方式其实与计算机中的程序中断的概念类似。通过esp,ebp,eip这几个寄存器来控制堆栈的情况。