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解决此问题

  • 相关阅读:
    printcap
    browser-ua
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode70 爬楼梯
  • 原文地址:https://www.cnblogs.com/cxgg/p/9866368.html
Copyright © 2011-2022 走看看