第八周课上内容补做
1. 通过输入gcc -S -o main.s main.c
将下面c程序”week04学号.c“编译成汇编代码
int g(int x){
return x+3;
}
int f(int x){
int i = 学号后两位;
return g(x)+i;
}
int main(void){
return f(8)+1;
}
删除汇编代码中 . 开头的代码,提交f 函数的汇编代码截图,图中用矩形标出函数栈帧的形成和销毁的代码。
结合C函数调用机制及栈帧指针中的实例,了解了什么命令是函数栈帧的形成以及代码销毁。
2.通过输入gcc -S -o main.s main.c
将下面c程序”week04学号.c“编译成汇编代码
int g(int x){
return x+3;
}
int f(int x){
int i = 学号后两位;
return g(x)+i;
}
int main(void){
return f(8)+1;
}
参考GDB调试汇编堆栈过程分析,使用gdb跟踪汇编代码,在纸上画出f中每一条语句引起的eip(rip),ebp(rbp),esp(rsb),eax(rax)的值和栈的变化情况。提交照片,要有学号信息。
实验步骤:
-
gcc - g week04-20165312.c -o week04-20165312 -m32
在64位的机器上产生32位汇编 -
gdb week04-20165312
进行gdb调试 -
b main
在main函数处设置断点 -
run
运行程序 -
disassemble
反汇编命令,查看执行时源代码的机器码 -
x/i $pc
-
i r
查看各寄存器的值 -
si
进入下一条汇编指令 -
x/2a
查看栈的变化 -
结果
实验过程中遇到的困难
无法在64位机器上进行32位汇编
输入sudo apt-get install libc6-dev-i386
出现问题
通过查阅资料知道:主要原因应该是/var/lib/dpkg/updates
文件夹里面的资料有错误,使得更新软件的程序出现错误,所以得把它们完全删除,通过sudo apt-get update
这个指令会重新建立这些资料,使用sudo apt-get upgrade
更新你的电脑里面已安装的软件的明细,根据软件的明细更新软件到最新版。
解决方法:
sudo rm /var/lib/dpkg/updates/*
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libc6-dev-i386
gcc - g week04-20165312.c -o week04-20165312 -m32