在x64位linux环境下,将左侧代码在gcc –S –o main.s main.c -m32编译成为汇编代码。
运行过程
函数的入口是main。
进入新的函数便保存原有的ebp指针位置,并把ebp指向esp,开拓出一个新的堆栈块。
右侧20,21在main所属的堆栈块中保存整数3
右侧22调用新函数f,于是转移到右侧9,10开拓新的堆栈块
右侧11,12,13 把3放入eax中并把3放入此函数站 也就是对应函数的f(3)传入参数
右侧14调用新函数g,转移到2,3 又开拓堆栈块,传入参数,把3放入eax并加一 在结尾撤销一个堆栈块。ret使得读入原来eip的位置,继续从15运行。15撤销堆栈块 并通过ret修改eip指针指回右侧23
右侧23 eax加2得到最终结果 撤销堆栈块并修改会原eip值 至此整个程序结束
总结:
图灵任何可计算的模型先是抽象成人的运算过程又机械化抽象成为图灵机。在汇编情况下和在c语言编程的情况下计算能力是等同的,但是在汇编语言下可供操作的一些数据结构变得更加原始。
当前注视的位置变成了eip而可供记录会修改的除了寄存器还有内存空间,一些寄存器起到了指针的作用。而每进入一个新的函数,需要开拓一个新的堆栈块。从此处可以看出在会汇编下的编程模式。
参考:
- 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000