1 通过输入gcc -S -o main.s main.c -m32 将下面c程序”week0401学号.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; }
2. 删除汇编代码中 . 开关的代码,提交f 函数的汇编代码截图,图中用矩形标出函数栈帧的形成和销毁的代码
#include<stdio.h>
int g(int x){
return x+3;
}
int f(int x){
int i=31;
return g(x)+i;
}
int main(void){
return f(8)+1;
}
使用以下代码进行汇编:
gcc -S -o week040120232831.s week040120232831.c -m32
结果如下:(出错,发现没有用32位编译的包)
使用代码安装32位的编译包
sudo apt-get install gcc-multilib
再次编译;
查看week040120232831.s文件发现,很杂乱:
因此需要删除多余的辅助代码,而这些辅助代码就是类似“.size”等“.”开头的文件。通过以下代码即可删除所有“.”开头的辅助代码,且删除后的代码如下:
sed -i '/[.]/d' week040120232831.s
f 函数的汇编代码截图如下:
用矩形标出函数栈帧的形成和销毁的代码如下:
1 通过输入gcc -S -o main.s main.c 将下面c程序”week0402学号.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;
}
代码如下:
#include<stdio.h>
int g(int x){
return x+3;
}
int f(int x){
int i=31;
return g(x)+i;
}
int main(void){
return f(8)+1;
}
编译代码如下:
gcc -S -o week040220232831.s week040220232831.c
生成week040220232831,并进行gdb,不生成无法进行gdb调试:
gcc -g week040220232831.c -o week040220232831 -m32
进行gdb调试
gdb week040220232831
一路按照以下输入进行gdb调试:
b main
r
disassemble
i r
display /i $pc
si
i r
si
x/i $pc
si
x/i $pc
i r
x /4a 0xffffd118
si
x/i $pc
i r
x /4a 0xffffd118
disassemble
以上即结束,x /4a 0xffffd118中的16进制数是ebp的物理地址
在纸上画出f中每一条语句引起的eip(rip),ebp(rbp),esp(rsb),eax(rax)的值和栈的变化情况。图如下所示: