在计算机系统中,程序的运行离不开CPU、内存等之间的协作。而在CPU中, 其内部的寄存器起到了十分重要的作用,有通用寄存器和特殊功能寄存器之分。通用寄存器有AX、BX、CX、DX(这些是用来保存数据用的),以及ESI、EDI(拷贝数据使用)等;特殊功能寄存器例如EBP(指向程序栈栈底)、ESP(指向程序栈栈顶)等。现在就以如下的例子说明程序在计算机中的机器级表示过程。
图1是C语言描述的,简单的将两个数求和,打印并返回和。在机器级别,这段简单的程序会被翻译成如下汇编代码。
从图3 可知,当程序之间形成函数调用的时候,会在内存中形成函数栈帧,函数栈帧向下生长,运行时堆则是向上增长的。内存的地址是从下往上依次增大的。
在程序执行过程中,调用函数时,首先会使EBP(保存之前函数调用的栈底地址)入栈,ESP自动减去4个字节,EBP指向ESP(对应demo汇编代码1,2)。然后,会为新函数栈开辟栈帧内存空间,一般为32个字节。接着进行一列CPU寄存器与函数栈内存之间的函数调用,进行add函数调用之前的数据准备工作(对应demo汇编代码3--9)。当调用add函数时,会在当前函数栈中保存返回地址,在开辟add的新函数栈。
在add汇编代码中,同会把调用add的函数栈底EBP入栈,之后进行一系列的地址操作后,返回demo函数,最后打印结果。