实验:
首先,写一个简单的c程序
通过命令编译c程序为汇编代码
打开汇编代码
简化汇编代码
假设目前栈底位置为1000,栈为空栈,即ebp=esp=1000,令目前栈底位置为单元1,每单元占4字节
代码从main部分开始执行
pushl %ebp ;在单元1处保存目前ebp1000,栈顶移动一个单元esp=996
movl %esp,%ebp;ebp=996
subl $4,%esp;esp=992
movl $9,(%esp);在单元2处保存立即数9
call f;在单元3处保存目前eip23,栈顶移动一个单元esp=988,转至f开始执行
pushl %ebp;在单元4处保存目前ebp996,栈顶移动一个单元esp=984
movl %esp,%ebp;ebp=984
subl $4,%esp;esp=980
movl 8(%ebp),%eax;将单元2内容存至eax,eax=9
movl %eax,(%esp);将eax中内容9至单元5
call g;在单元6处保存目前eip15,栈顶移动一个单元esp=976,转至g开始执行
pushl %ebp ;在单元7处保存目前ebp984,栈顶移动一个单元esp=972
movl %esp,%ebp;ebp=972
movl 8(%ebp),%eax;将单元5内容存至eax,eax=9
addl $7,%eax;eax中内容加上立即数7,eax=16
popl %ebp;ebp=984
ret ;eip=15,返回f继续执行
leave;ebp=996
ret ;eip=23,返回main继续执行
addl $1,%eax;eax中内容加上立即数1,eax=17
leave;ebp=1000,esp=1000
ret
总结:
这个简单的小程序主要是依赖寄存器、内存以及内存中的栈进行工作的
操作的实现主要依赖寄存器
调用的实现主要依赖内存中的栈
王潇洋
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000