zoukankan      html  css  js  c++  java
  • 2017-2018-20155206 《信息安全系统设计基础》第五周学习总结

    2017-2018-20155206 《信息安全系统设计基础》第五周学习总结

    教材学习内容总结

    程序编码

    、 GCC将源代码转化为可执行代码的步骤:

    、 C预处理器——扩展源代码-生成.i文件
    、 编译器——产生两个源代码的汇编代码-——生成.s文件
    、 汇编器——将汇编代码转化成二进制目标代码——生成.o文件
    、链接器——产生可执行代码文件

    机器级代码

    、 1.机器级编程的两种抽象
    、 (1)指令集结构ISA
    、 是机器级程序的格式和行为,定义了处理器状态、指令的格式,以及每条指令对状态的影响。
    、 (2)机器级程序使用的存储器地址是虚拟地址
    、 看上去是一个非常大的字节数组,实际上是将多个硬件存储器和操作系统软件组合起来。

    、** 2.几个处理器:**

    、 程序计数器(CS:IP)
    、整数寄存器(AX,BX,CX,DX)
    、条件码寄存器(OF,SF,ZF,AF,PF,CF)
    、浮点寄存器
    、一条机器指令只执行一个非常基本的操作。

    程序编码

    、书上107页的代码,需要用到反汇编器。在Linux系统中,带‘d’命令行标志的程序OBJDUMP可以充当这个角色。

    数据格式

    、数据传送指令的三个变种:

    movb 传送字节
    movw 传送字
    movl 传送双字

    访问信息

    、 一个IA32中央处理单元(CPU)包含8个存储32位置的寄存器

    操作数指示符

    、 立即数
    、 寄存器
    、 存储器

    、** 寻址方式**

    、 (1)立即数寻址方式

    、 格式:$后加用标准c表示法表示的整数,如$0xAFF

    、 (2)寄存器寻址方式

    、 如%eax,与汇编中学过的AX寄存器类比。

    、 (3)存储器寻址方式

    、 直接寻址方式
    、 寄存器间接寻址方式
    、 寄存器相对寻址方式
    、 基址变址寻址方式
    、 相对基址变址寻址方式

    数据传送指令

    、 MOV

    movb 传送字节
    movw 传送字
    movl 传送双字

    、MOVS

    movsbw 将做了符号扩展的字节传送到字
    movsbl 将做了符号扩展的字节传送到双字
    movswl 将做了符号扩展的字传送到双字
    、 MOVZ

    movzbw 将做了零扩展的字节传送到字
    movzbl 将做了零扩展的字节传送到双字
    movzwl 将做了零扩展的字传送到双字
    、** 算术和逻辑操作**
    、 一、加载有效地址

    、 加载有效地址指令——leal,是movl指令的变形。

    、 指令形式:从存储器读取数据到寄存器。

    、 实际:将有效地址写入到目的操作数,而目的操作数必须是寄存器;并不真实引用存储器。

    、 二、一元操作和二元操作

    、 1.一元操作

    、 只有一个操作数,既是源又是目的,可以是一个寄存器,或者存储器位置。

    、 2.二元操作

    、 第一个操作数可以是立即数、寄存器或者存储器位置
    、 第二个操作数可以是寄存器或者存储器位置
    、 但是不能同时是存储器位置。

    、** 控制**

    数据传送指令

    、 MOV 不影响标志位
    、 PUSH POP 不影响标志位
    、 XCHG 交换指令 不影响标志位
    、 XLAT 换码指令 不影响标志位
    、 LEA 有效地址送寄存器指令 不影响标志位
    、 PUSHF 标志进栈指令 不影响标志位
    、 POPF 标志出栈指令 标志位由装入值决定
    、 访问条件码

    、 这个指的是SET指令,通过set与不同的条件码的组合,达到不同的跳转条件。
    、 某些底层的机器指令可能有多个名字,我们称之为“同义名”。
    、 跳转指令及其编码
    、 jump分为直接跳转和间接跳转:

    、 直接跳转:后面跟标号作为跳转目标
    、 间接跳转:*后面跟一个操作数指示符

    过程

    、 一个过程调用包括将数据和控制从代码的一部分传递到另一部分。另外,它还必须在进入时为过程的局部变量分配空间,并在退出时释放这些空间。
    、 一、栈帧结构

    、 栈用来传递参数、存储返回信息、保存寄存器,以及本地存储。

    、 1.栈帧

    、 为单个过程分配的那部分栈称为栈帧,通用结构见149页

    、 所以本质上栈帧还是栈。

    、 2.两个指针

    、 最顶端的栈帧以两个指针界定:

    、 寄存器%ebp-帧指针

    、 寄存器%esp-栈指针

    、 栈指针可移动,所以信息访问多相对于帧指针。
    、 二、转移控制

    、 这里用到的主要就是CALL和RET这一对指令。

    、 1.call

    、 call指令和转移指令相似,同样分直接和间接,直接调用的目标是标号,间接调用的目标是*后面跟一个操作数指示符,和JMP一样。

    、 CALL指令的效果是将返回地址入栈,并跳转到被调用过程的起始处。返回地址是还在程序中紧跟在call后面的那条指令的地址。

    、 然后就会用到ret了。

    、 2.ret

    、 ret指从栈中弹出地址,返回到call指令后的那条指令。

  • 相关阅读:
    一段路
    memcache 键名的命名规则以及和memcached的区别
    浏览器解释网页时乱码
    windows下安装Apache
    巧用PHP数组函数
    程序返回值的数据结构
    Linux如何生成列表
    判断用户密码是否在警告期内(学习练习)
    判断用户的用户名和其基本组的组名是否一致
    sed笔记
  • 原文地址:https://www.cnblogs.com/zf011/p/7694253.html
Copyright © 2011-2022 走看看