首页 > 代码库 > 20145235 《信息安全系统设计基础》第05周学习总结

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

程序的机器级表示

  • 编译器承担产生汇编代码的工作
  • 系统是一个机器产生的汇编语言程序,而不是由人设计的某个东西。

3.2 程序编码

  • gcc是Linux上默认的编译器  gcc -01  告诉编译器使用第一级优化。优化等级越高,程序运行的越快,编译时间越长,用调试工具调试程序越困难。高级别的的优化产生的代码会严重改变形式。
  • gcc将源代码转换为可执行代码。首先,C预处理器扩展源代码,插入所有用#include命令指定的文件,并扩展所有用#define声明指定的宏。
  • 汇编器将汇编代码转换成二进制目标代码,目标代码是机器代码的一种形式,包含所有指令的二进制表示,但没有填入地址的全局值。
  • 连接器将目标文件与实现库函数的代码合并,并产生最终的可执行代码文件。可执行代码是处理器执行的代码格式。

3.1.1 机器级代码

  • 机器级程序的格式和行为,定义为指令集体系结构,他定义了处理器状态、指令的格式、以及每条指令的对状态的影响。处理器并发地执行许多指令但采取措施保证整体行为。
  • 机器级程序使用的存储器地址是虚拟地址,提供的存储器模型上看是一个非常的字节数组。存储器系统的实际实现是将多个硬件存储器和操作系统软件组合起来。
  • 汇编代码不区分有符号无符号整数,不区分各种类型的指针,甚至不区分指针和整数。
  • 程序存储器包含:程序的可执行机器码,操作系统需要的一些信息,用来管理过程调用和返回的运行时栈,以及用户分配的存储器块。

3.2.2 代码示例

  • gcc -01 -s code.c    //使用“-s” 就能得到C语言编译器产生的汇编代码 。这会产生一个汇编文件 code.s
  • gcc -01 -c code.c    //使用“-c”gcc会编译并汇编该代码,产生目标代码文件code.o,他是二进制格式,无法直接查看。
  • 反汇编器可以查看目标文件内容:objdump -d code.o
  • “gcc -01 -o prog code.o main.c” 通过之前讲的,应该是让编译器将目标文件“code.o”与实际函数库 “main.c”合并 生成可执行文件prog

3.2.3 关于格式的注解

3.3 数据格式

  • 单精度:4字节  双精度:8字节  扩展精度:10字节实际存储成12字节
  • moveb、movw、movl:对应字节、字、双字。

3.4 访问信息

技术分享

  • 根据上学期学的汇编:%ecx、%edx分别是代码段段寄存器、数据段寄存器。其他的都记得,不知道这个帧指针的运行机制,很是期待!

3.4.1 操作数指示符

  • 这些上学期的汇编都学过,还好没有忘记,就是新加了一个比例变址寻址,没有见过具体事例。

 技术分享

  • 通过练习题3.1对IA32汇编有了一定的认识。

 技术分享

  • 对于上面所讲的我觉前面的这张表就可以理解:

技术分享

 

  • IA32和8086很不一样,尤其是原操作数和目的操作数的顺序,这个老师上课也讲明白了,再次加深印象。
  • movs和movz 不同的扩展方式很简单,很容易理解。
  • 对于栈操作,这个和8086的内容基本一样,%esp指向栈顶元素,不同字节数的操作%esp进行相应字节数的加减,就是我不明白为什么从16位到32位为什么“栈”编码还是一个字节?

问题

  • gcc 编译时是否有默认的优化等级?必须要声明优化等级吗?
  • 和上学期的汇编有点不一样代码基本上能看懂,也明白出栈入栈是咋回事,就是12(),8()是什么意思?ret是什么意思?上学期没学。(此问题已解决)
  • 技术分享
  •  在3.4.1中讲到的寻址方式和上学期学的寻址方式感觉换汤不换药,但是上学期学的内容对8个通用寄存器的方法有严格限制,比如CX代码段寄存器是决不允许当成目的操作数,寄存器与寄存器配合起来寻址也是有固定的组合,而这里说是任意的,不知道是不是和上学期的一样,还是后面会细讲,还是有不同之处?比毕竟一个是老版本一个是新版本。技术分享

感想

     网上对这本书评价很高,这学期最起码要把这本数认认真真看完,被说是经典肯定有其巨大的价值。

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