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

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

教材学习内容总结

程序编码

机器级代码

两种抽象

  • ISA指令集体系结构,机器级程序的格式和行为,它定义了处理器状态、指令的格式以及每条指令对状态的影响。

  • 机器级程序使用的存储器地址是虚拟地址,提供的存储器模型看上去是一个非常大的字节数组。

  • 操作系统负责管理虚拟地址空间,将虚拟地址翻译成实际处理器存储器中的物理地址。

  • 用objdump -d xxx.o -o xxx.s 反汇编

  • ATT格式(Linux下的汇编格式)与Intel格式(Windows的汇编格式)不同之处:
    1.Intel代码省略了指示大小的后缀。我们看到指令mov而不是movl;
    2.Intel代码省略了寄存器名字前的%,使用的是esp而不是%esp;
    3.Intel代码用不同方式来描述存储器中的位置:例如,是‘DWORD PTR [ebp+8]’而不是'8(%ebp)'
    4.在带有多个操作数的指令情况下,列出操作数的顺序相反。

数据格式

  • “字”表示16位数据类型,“双字”表示32位数据类型,“四字”表示64位数据类型。
  • 大多数GCC生成的汇编代码指令都有一个字符后缀,表明操作数的大小。b代表字节,w代表字,l代表双字。

访问信息

  • 一个IA32中央处理单元(CPU)包含一组8个存储32位值的寄存器。用来存储整数数据和指针。
  • 操作数三种类型:1.立即数;2.寄存器Ea表示寄存器a,R[Ea]表示它的值;3.存储器Mb[Addr]表示对存储在存储器中从地址Addr开始的b个字节值的引用。
  • 有效地址Imm(Eb,Ei,s)=Imm+R[Eb]+R[Ei]*s(s为1、2、4、8)
  • 数据传送指令MOV S,D(将S中的字节传送到D) MOVS(符号扩展),MOVZ(零扩展)不能直接从存储器到存储器,需寄存器中转。
  • 栈是向下增长的,栈顶元素的地址是所有栈中元素地址中最低的,栈指针%esp保存着栈顶元素的地址。

算术和逻辑操作

  • leal将有效地址写入到目的操作数,目的操作数必须是一个寄存器。
  • 一元操作:只有一个操作数,既是源又是目的,操作数可以是一个寄存器或者存储器位置。
  • 二元操作:第二个操作数既是源又是目的,两个操作数不能同时是存储器。
  • 移位:先给出位移量,然后是位移的数值,可进行算数和逻辑右移。移位量可以是立即数或单字节寄存器元素%cl中的数。
  • 有符号除法指令idivl,商在寄存器%eax,余数在%edx。
  • 无符号除法使用divl指令,通常将寄存器%edx设置为0。

控制

  • 条件码:描述最近的算数或者逻辑操作的属性,可以检测这些寄存器来执行条件分支指令。
  • CF:进位标志,最近操作使高位产生进位,用来检测无符号操作数的溢出
  • ZF:零标志,最近操作得出的结果为0
  • SF:符号标志,最近操作得到的结果为负数
  • OF:溢出标志,最近操作导致一个补码溢出-正溢出或负溢出。
  • leal不改变任何条件码
  • CMP和SUB指令行为一样,只是CMP只设置条件码而不更新目标寄存器。
  • 访问条件码的方式:根据条件码的某个组合,将一个字节设置成0或1;可以条件跳转到程序某个其他的部分;有条件的传送数据。
  • SET指令根据计算t=a-b的设置条件码
  • jmp指令是无条件跳转,可以是直接跳转,即跳转目标是作为指令的一部分编码;也可以是间接跳转,即跳转目标从寄存器或存储器位置中读出的,写法是‘*’后面跟一个操作数指示符。
  • 条件跳转只能是直接跳转的。
  • 当执行PC相关的寻址时,程序计数器的值是跳转指令后面那条指令的地址,而不是跳转指令本身的地址。

过程

  • 数据传递、局部变量的分配和释放通过操纵程序栈来实现。
  • 为单个过程分配的栈叫做栈帧,寄存器%ebp为帧指针,而寄存器指针%esp为栈指针,程序执行时栈指针移动,大多数信息的访问都是相对于帧指针。
  • call指令有一个目标,即指明被调用过程起始的指令地址,效果是将返回地址入栈,并跳转到被调用过程的起始处。
  • ret指令从栈中弹出地址,并跳转到这个位置。

代码调试中的问题和解决过程

  • 1.在调试第一个代码code.c时,生成汇编文件时,出现错误。

  • 解决过程:分析错误产生原因应是0与o混淆,尝试用o,问题解决。

  • 2.问题

  • 解决过程:根据提示再对比所给命令,缺少了输入文件。

课后作业中的问题和解决过程

  • 练习题3.14,确定操作数大小以及是有符号数还是无符号数时,无从下手。
  • 解决过程:参考答案,确定思路,结合前面所学的知识,列出所有可能。

本周代码托管截图

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 2/2 10/10
第二周 30/30 1/3 7/17
第三周 0/30 1/4 5/22
第四周 30/60 1/5 10/32

参考资料

原文地址:https://www.cnblogs.com/LLLLLLQL/p/5967417.html