• 20145308 《信息安全系统设计基础》第5周学习总结


    20145308 《信息安全系统设计基础》第5周学习总结

    教材学习内容总结

    第三章 程序的机器级表示

    • 计算机执行机器代码,用字节序列编码低级的操作
    • GCC C以汇编代码的形式产生输出,汇编代码是机器代码的文本表示
    • 3.1 历史观点
      • 平坦寻址模式:程序员将整个存储空间看作一个大的字节数组,Linux和DOS使用
      • 分段模式:8086
      • IA32:带保护模式的平坦寻址方式
    • 3.2 程序编码
      • 编译P1.c和P2.c:gcc -01 -o -m32 p p1.c p2.c
      • -01第一级优化,编译时间长,程序性能方面考虑,第二级优化是较好的选择
      • C预处理器扩展源代码,汇编器产生源代码的汇编代码后缀.s,汇编器再将汇编代码转换成二进制目标代码后缀.o, 链接器将目标代码文件与实现库函数的代码合并,产生最中国的可执行代码文件p
      • 3.2.1 机器级代码
        • 指令集体系结构(ISA):机器级程序的格式和行为,定义了处理器状态、指令的格式以及每条指令对状态的影响
        • 虚拟地址:使用的存储器地址
        • 程序计数器(PC):指示下一条指令在存储器中的地址
        • 寄存器文件:8个命名的位置,分别存储32位的值,可以存储地址或整数数据
        • 条件码寄存器:实现控制或数据流中的条件变化
        • 浮点寄存器
      • 3.2.2 代码示例
        • 命令行中使用-s得到汇编代码,使用-c会编译并汇编
        • 反汇编器:带-d命令行标志的程序OBJDUMP
      • 3.2.3 关于格式的注解
    • 3.3 数据格式
      • 字表示16位数据类型
      • int、long int、所有指针都用双字,浮点数单精度4字节、双精度8字节、扩展精度10字节
    • 3.4 访问信息
      • 3.4.1 操作数指示符
        • 操作数三种类型:立即数($-577)、寄存器(Ea表示寄存器R[Ea]表示寄存器值)、存储器(Mb[Addr]表示对存储在存储器中从地址Addr开始的b个字节值的引用)
      • 3.4.2 数据传送指令
        • MOV传送,MOVS符号拓展,MOVZ零拓展
        • 将一个值从一个存储器位置复制到另一个存储器位置需要两条指令
      • 3.4.3 数据传送实例
        • 局部变量保存在寄存器中
    • 3.5 算数和逻辑操作
      • 3.5.1 加载有效地址
        • leal将源操作数存储器的地址写入到目的操作数寄存器中
      • 3.5.2 一元操作和二元操作
        • 一元操作操作数可以是寄存器或存储器位置
        • 二元操作第一个操作数可以是立即数、寄存器或存储器位置,第二个操作数可以是寄存器或存储器位置,两操作数不能同时为存储器位置
      • 3.5.3 移位操作
        • SAL、SRL都是左移指令,SAR算数右移、SLR逻辑右移
      • 3.5.4 讨论
        • 编译器产生的代码中,会用一个寄存器存放多个程序值,还会在寄存器之间传送程序值
      • 3.5.5 特殊的算数操作
        • 无符号乘法(mull)补码乘法(imull):一个参数必须存放在%eax,而另一个作为指令的源了操作数给出,乘积存放在%edx和%eax中
        • 除法将%edx和%eax中的64位数作为被除数,商存储在%eax中,余数存储在%edx
    • 3.6 控制
      • 3.6.1 条件码
        • CF进位标志,检查无符号数的溢出
        • ZF零标志
        • SF符号标志
        • OF溢出标志
        • 除了只设置条件码而不更新目标寄存器外,CMP与SUB行为相同,TEST与ADD行为相同
      • 3.6.2 访问条件码
        • 条件码使用方法:1)根据条件码的组合,设置字节为0或1 2)条件跳转到程序其他部分 3)条件传送数据
        • SET指令的目的操作数是8个单字节寄存器元素之一或是存储一个字节的存储器位置
      • 3.6.3 跳转指令及其编码
        • 直接跳转:跳转目标是作为指令的一部分编码的
        • 间接跳转:跳转目标是从寄存器或存储器位置中读出的
        • 执行与PC相关寻址时,程序计数器的值是跳转指令后面的那条指令的地址
      • 3.6.4 翻译条件分支
        • 汇编代码会利用跳转指令插入条件和无条件分支
      • 3.6.5 循环
        • do-while循环:至少执行一次
        • while循环:第一次执行之前,循环可能中止,使用条件分支,在需要时省略循环体的第一次执行
        • for循环:先给出初始化条件
      • 3.6.6 条件传送指令
        • 基于条件数据传送的代码比基于条件控制转移的代码性能好
      • 3.6.7 switch语句
        • 使用跳转表
        • 跳转表对重复情况的处理是使用相同的代码标号,对缺失情况的处理使用默认标号
    • 3.7 过程
      • 数据传递、局部变量的分配和释放通过操纵程序栈来实现
      • 3.7.1 栈帧结构
        • IA32用程序栈支持过程调用
        • 机器用栈来传递过程参数、存储返回信息、保存寄存器用于以后恢复
        • 栈帧:为单个过程分配的栈
        • %ebp为帧指针、%esp为栈指针,栈指针可以移动,大多数信息访问相对于帧指针
      • 3.7.2 转移控制
        • call指令的效果:返回地址入栈,并跳转到被调用过程的起始处,返回地址是在程序中紧跟在call后面那条指令的地址
        • ret指令从栈中弹出地址
      • 3.7.3 寄存器使用惯例
        • 程序寄存器组是唯一能被所有过程共享的资源
        • %eax、%edx、%ecx被划分为调用者保存寄存器
        • %ebx、%esi、%edi被划分为被调用者保存寄存器
      • 3.7.4 过程示例
        • “建立”初始化栈、“主体”执行过程实际计算、“结束”恢复栈初始状态以及过程返回
      • 3.7.5 递归过程
        • 过程被调用时分配局部存储,当返回时释放存储
    • 实验楼
      • stack.c反汇编成stack.s的代码

      • 先从main程序开始执行,调用y前,先将返回地址入栈,再将%ebp入栈,将%ebp放在现在的栈顶位置,栈顶指针减4分配空间,再将参数8入栈,调用y

      • y调用z前,再进行一次将返回地址和%ebp入栈,改变%ebp位置的操作,将栈顶指针减4分配空间,将8存贮在%eax寄存器中,再将现在%eax中的值入栈保存,调用z

      • 再进行一次将返回地址和%ebp入栈,改变%ebp位置的操作,将8存入%eax便于操作,对8进行加3的操作,弹出到%ebp,返回main

      • 返回main,将%eax中的参数加1,结束程序

    教材学习中的问题和解决过程

    • 练习3.33 D
    • 做此题的时候,很不理解%esp和偏移量为+4、+8两个位置存储的数值是如何形成的,后来反复研究GCC生成的汇编代码,发现是将字符串“%x %x”存储在%esp的位置,同时通过leal命令,将x和y的位置存储在+8、+4的位置

    本周代码托管截图


    其他(感悟、思考等,可选)

    • 本周主要学习了将C语言代码转化为更低级的汇编代码,通过逆向工程更加深入理解代码的运行过程,之前选修过汇编,所以对汇编程序有一定的理解,所以前面的指令都感觉很熟悉,但是对于执行过程中调用程序堆栈的运行过程还是有一些模糊,所以更加深入的学习后对堆栈过程理解得更透彻了

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 1/2 25/30 学习Linux指令
    第二周 50/50 1/3 25/55 Linux系统下的开发环境
    第三周 20/70 1/4 25/80 信息的表示和处理
    第五周 20/90 1/5 30/110 程序的机器级表示
  • 相关阅读:
    Java实例_队列Queue用法
    JAVA中不同类型的取值范围
    面试被问到的题
    关于Maven启动项目各种.xml文件和.properties文件找不到问题的解决
    jupyter使用
    java中“==”和equal区别
    redis持久化的几种方式
    事务是什么,以及事务四个特性
    Java中的String类能否被继承?为什么?以及final和static的区别
    pytest.mark.parametrize 参数化
  • 原文地址:https://www.cnblogs.com/yg961022/p/5967392.html
Copyright © 2020-2023  润新知