第八周课上内容补做

第八周课上内容补做

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函数调用机制及栈帧指针中的实例,了解了什么命令是函数栈帧的形成以及代码销毁。

1047583-20181028174751533-190381280.png

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查看栈的变化

  • 结果

1047583-20181028174817785-789091540.jpg

实验过程中遇到的困难

无法在64位机器上进行32位汇编

1047583-20181028174832394-1992559493.png

输入sudo apt-get install libc6-dev-i386出现问题

1047583-20181028174846219-619185462.png

通过查阅资料知道:主要原因应该是/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

1047583-20181028174904134-948826714.png

参考dpkg 被中断,您必须手工运行 sudo dpkg –configure -a解决此问题

转载于:https://www.cnblogs.com/cxgg/p/9866368.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值