信息安全系统设计基础第四周学习总结

基础概念梳理

3.1处理器的历史:

  • DOS时代的平坦模式,不区分用户空间和内核空间,很不安全。
  • 8060的分段模式
  • IA32的带保护模式的平坦模式

3.2程序编码

对机器级编程而言的两种重要抽象:

  • 指令集合系结构(机器级程序的格式和行为,定义了处理器状态指令的格式以及每条指令对状态的影响)
  • 存储器地址是虚拟地址G

相关命令:

  • 执行汇编命令:gcc –s xxx.c –o xxx.s
  • 反汇编命令:objdump –d xxx
  • 64位处理器得到32代码的命令:gcc –m32 –s xxx.c

3.3数据格式:

信息安全系统设计基础第四周学习总结_第1张图片

3.4访问信息

三种操作数:

  • 立即数:常数值。表示为$c标准表示的整数。
  • 寄存器:表示某个寄存器的内容。
  • 存储器:根据计算出来的地址访问某个存储器位置

数据传送指令

信息安全系统设计基础第四周学习总结_第2张图片

3.5算数和逻辑操作

整数算数操作

信息安全系统设计基础第四周学习总结_第3张图片

特殊算数操作

信息安全系统设计基础第四周学习总结_第4张图片

3.6控制

条件码

  • CF:进位标志。最近的操作使最高位产生了进位。可以用来检查无条件符号操作数的溢出。
  • ZF:零标志。最近操作得出的结果为0.
  • SF:符号标志。最近的操作得到的结果为负数。
  • OF:溢出标志:最近的操作导致一个补码溢出——正溢出或负溢出。

比较和测试指令

信息安全系统设计基础第四周学习总结_第5张图片

访问条件码

条件码读取的三种方法:

  • 根据条件码的某个组合,将一个字节设置为0或1。以下SET指令的区别在于他们考虑的条件码的组合是什么,这些指令名字的不同后缀指明了它们所考虑的条件码的组合。
    信息安全系统设计基础第四周学习总结_第6张图片
  • 可以跳转到程序的某个其他部分。
  • 可以有条件地传输数据。

跳转指令及其编码

信息安全系统设计基础第四周学习总结_第7张图片

循环指令

do-while循环

格式:
do
body-statement//重复执行
while(test-expr);//对括号内求值

while循环

格式:
while(test-expr)
body-statement

for循环

格式:
for(init-expr;test-expr;update-expr)
body-statement

条件传送指令

两种方法

  • 利用控制的条件转移。当条件满足时就,程序沿着一条执行路径进行,而当条件不满足时,就走另一路径。
  • 数据的条件转移
    信息安全系统设计基础第四周学习总结_第8张图片

switch语句

跳转表:是一个数组,表项i是一个代码段的地址,这个代码段实现当开关索引值等于i时程序应该采取的动作。

3.7过程

数据传递、局部变量的分配和释放通过操纵程序栈来实现。

栈帧结构

机器用栈来传递过程参数、存储返回信息、保存寄存器用于以后恢复,以及本地存储。为单个过程分配的那部分栈称为栈帧

转移控制指令

信息安全系统设计基础第四周学习总结_第9张图片
call指令有一个目标,即指明被调用过程起始的指令地址。
call指令的效果是将返回地址入栈。并跳转到被调用过程的起始处。、

递归过程

栈规则提供一种机制,每次函数调用都有他自己私有的状态信息存储。如果需要,还可以提供局部变量的存储。当过程被调用是分配局部存储,当返回时释放存储。

重点知识

p106:

  • ISA:指令集合系结构
  • PC寄存器:程序计数器,整数寄存器文件,条件码寄存器,浮点寄存器

p107:

  • gcc -S xxx.c -o xxx.s 获得汇编代码
  • objdump -d xxx 反汇编
  • 注意函数前两条和后两条汇编代码,所有函数都有,建立函数调用栈帧
    注意: 64位机器上想要得到32代码:gcc -m32 -S xxx.c
    MAC OS中没有objdump, 有个基本等价的命令otool
    Ubuntu中 gcc -S code.c (不带-O1) 产生的代码更接近教材中代码(删除"."开头的语句)
    p108:
  • 二进制文件可以用od 命令查看,也可以用gdb的x命令查看。
  • 有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看
    od code.o | more
    od code.o > code.txt
    p109:
  • gcc -S 产生的汇编中可以把 以”.“开始的语句都删除了再阅读

p110:
了解Linux和Windows的汇编格式有点区别:ATT格式和Intel格式

  • intel代码省略了指示大小的后缀
  • intel代码省略了寄存器名字前面的‘%’符号
  • intel代码用不同的方式来描述存储器中位置。
  • 在带有多个操作数的指令情况下,列出操作数的顺序相反。

    p111: 表中不同数据的汇编代码后缀
    信息安全系统设计基础第四周学习总结_第10张图片

p112:

  • esi edi可以用来操纵数组
  • esp ebp用来操纵栈帧
  • 对于寄存器,特别是通用寄存器中的eax,ebx,ecx,edx,32位的eax,16位的ax,8位的ah,al都是独立的
  • 例子:假定当前是32位x86机器,eax寄存器的值为0x8226,执行完addw $0x8266, %ax指令后eax的值是多少?
    解析:0x8226+0x826=0x1044c, ax是16位寄存器,出现溢出,最高位的1会丢掉,剩下0x44c,不要以为eax是32位的不会发生溢出.

p113:

  • 结合表,深入理解各种 寻址方式;理解操作数的三种类型:立即数、寄存器、存储器;
  • 掌握有效地址的计算方式 Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s

p114:

  • MOV相当于C语言的赋值”=“
  • 注意ATT格式中的方向,
  • 注意不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下。
  • 能区分MOV,MOVS,MOVZ,掌握push,pop

p115/p116:

  • 栈帧与push pop
  • 注意栈顶元素的地址是所有栈中元素地址中最低的。

p117:

  • 指针就是地址
  • 局部变量保存在寄存器中。

p119:

  • 结合表理解一下算术和逻辑运算
  • 注意目的操作数都是什么类型
  • 特别注意一下减法是谁减去谁
  • 注意移位操作移位量可以是立即数或%cl中的数

p123:

  • 结合C语言理解一下控制部分,也就是分支(if/switch),循环语句(while, for)如何实现的。
  • 控制中最核心的是跳转语句:有条件跳转

p124:

  • 有条件跳转的条件看条件码寄存器
  • 注意leal不改变条件码寄存器
  • CMP和SUB用在什么地方:除了只设置条件码而不更新目标寄存器以外,CMP指令几乎和SUM指令的行为是一样的

p125:

  • SET指令根据t=a-b的结果设置条件码

p127:

  • 跳转与标号

p128:

  • 实现if,switch,while,for
  • 无条件跳转jmp(实现goto)

p130/p131:
if-else 的汇编结构

  • if(test—expr)
    • then-statement
  • else
    • else-statement

p132/p133:
do-while格式

  • do
    • body-statement//重复执行
  • while(test-expr);//对括号内求值

p134/p135:
while格式

  • while(test-expr)
    • body-statement

p137/p138:
for格式

  • for(init-expr;test-expr;update-expr)
    • body-statement

p144/p145:

  • switch

p149:

  • IA32通过栈来实现过程调用
  • 掌握栈帧结构
  • 注意函数参数的压栈顺序.

p150/p151:

  • call/ret;
  • 函数返回值存在%eax中

p174:

  • bt/frame/up/down 关于栈帧的gdb命令

实验练习

信息安全系统设计基础第四周学习总结_第11张图片
信息安全系统设计基础第四周学习总结_第12张图片
信息安全系统设计基础第四周学习总结_第13张图片

参考资料

老师每周发的学习任务和重点知识

你可能感兴趣的:(信息安全系统设计基础第四周学习总结)