zoukankan      html  css  js  c++  java
  • 第八周课上内容补做

    第八周课上内容补做

    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

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

  • 相关阅读:
    最佳牛栏(前缀和+二分)
    分形之城(递归)
    约数之和(两种方法)
    递归实现指数型枚举
    【Luogu P3704】 [SDOI2017]数字表格
    【Luogu P2257】 YY的GCD
    【Luogu P2522】 [HAOI2011]Problem b
    【Luogu P3455】 [POI2007]ZAP-Queries
    【Luogu P3597】 [POI2015]WYC
    【Luogu T145192】 【2020.8.23NOIP模拟赛】最优路线
  • 原文地址:https://www.cnblogs.com/cxgg/p/9866368.html
Copyright © 2011-2022 走看看