2018-2019-1 20165228 《信息安全系统设计基础》第三周学习总结

2018-2019-1 20165228 《信息安全系统设计基础》第三周学习总结

教材学习内容总结

程序的机器级表示:

计算机系统的两种重要抽象

  • ISA(Instruction set architecture):指令集体系结构,机器级程序的格式和行为。定义了处理器状态指令的格式,以及每条指令对状态的影响。
  • 机器级程序使用的存储器地址是虚拟地址,提供的存储器模型看上去是一个非常大的字节数组。存储器系统实际表现是将多个硬件存储器和操作系统软件组合起来。

汇编代码及其特点

  • 直接面向处理器的程序设计语言。编译器将C语言代码转化为处理器执行的基本指令,汇编语言非常接近于机器代码。
  • 特点:可读性相较于机器代码更好的文本格式表示

X86-64指令

  • 指令长度:1到15字节不等
  • 指令格式:OPER [DEST [, SRC]] ;注释

如何得到C语言代码的汇编代码

  • 运行GCC编译器产生一个汇编文件code.s
gcc -Og -S code.c
//-Og表示优化程度,比如-01表示使用第一级优化,优化的级别与编译时间和最终产生代码的形式都有关系。
  • 使用-c命令选项,GCC编译并汇编该代码得到code.o
gcc -c code.c
  • 目标代码:二进制形式,无法直接查看,机器实际执行的程序只是对一系列指令进行编码的字节序列。

如何根据目标代码得到可读的内容

  • 使用反汇编器(disassembler),可根据目标代码产生一种类似于汇编代码的格式。
objdump -d code.o

处理器:

  • 程序处理器:只是下条将要执行的指令在存储器中的地址
  • 整数寄存器:包含16个命名的位置,分别存储64位值。可用来记录某些文件状态,也可用来保存临时值。
  • 条纹寄存器:保存最近执行的算数或逻辑指令的状态信息。
  • 浮点寄存器:一组向量寄存器可以存放一个或多个证书或浮点数值。

处理器的通用目的寄存器

  • X86-64的中央处理单元(cpu)包含一组16个存储64位值的通用目的寄存器

汇编指令

  • mov类指令:源操作数的值复制到目的操作数中。
  • movb 传送字节
  • movw 传送字
  • movvl 传送双字
  • movz 零扩展
  • 一元操作
  • INC 加一
  • DEC 减一
  • NEG 取负
  • NOT 取补
  • 二元操作
  • ADD 加
  • SUB 减
  • IMUL 乘
  • XOR 异或
  • OR 或
  • AND 与
  • 控制

条件码

 ```
 CF:进位标志

 ZF:零标志

 SF:符号标志

 OF:溢出标志
 ```

循环(while, for)

 C语言do-while循环:
     do
    body-statement
    while(test-expr);
 汇编实现形式:
     loop:
    body-statement
    t = test-expr;
    if(t)
        goto loop;

寻址方式

  • 立即数寻址:操作数在指令中直接给出,只能用于源操作数,数据长度应与目的操作数长度匹配。
  • 寄存器寻址:数放在CPU的内部寄存器中,源操作数与目的操作数长度应一致。
  • 存储器寻址:操作数存放在存储器中,指令中给出操作数的偏移地址信息。

过程

  • 一组指定的参数和一个可选的返回值实现某种功能。
  • 形式:函数、方法、子例程、处理函数等。
  • 实现过程需要的机器级支持机制
  • 传递控制
  • 传递数据
  • 分配和释放内存

分配和释放内存

  • 栈上的局部存储
  • 寄存器中的局部存储空间
    栈帧:过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。逻辑上讲,栈帧就是一个函数执行的黄精:函数参数、函数的局部变量、函数执行完后返回到哪里等等。
    延伸方式:栈是从高地址向低地址延伸。每个函数的每次调用都有自己独立的一个栈帧,即里面维持着所需要的各种信息。寄存器ebp指向当前的栈帧的地步(高地址),寄存器esp指向当前的栈帧顶部(低地址)。

异质的数据结构

  • C语言的struct声明创建一个数据类型,将可能不同类型的对象聚合到一个对象中。
  • 结构的所有组成部分都存放在一段连续区域内,结构的指针就是结构第一个字节的地址。

数据对齐

  • 对于大多数x86-64指令来说,保持数据对齐能够提高效率,但是它不会影响程序的行为。

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

  • 问题1:GDB调试问题“No source file named file.c. Make breakpoint pending on future shared library load?”和“没有符号表被读取。请使用”file” 命令”
  • 问题1解决方案:在编译的时候,没有加-g的选项,导致没有产生调试符号。

代码托管

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 124/124 1/1 9/9

posted on 2018-10-14 13:37  月半月半白勺  阅读(127)  评论(0编辑  收藏  举报

导航