20145229吴姗珊 《信息安全系统设计基础》第5周学习总结

20145229吴姗珊 《信息安全系统设计基础》第5周学习总结

教材学习内容总结

程序的机器级表示

  • 计算机执行机器代码,用字节序列编码低级的操作

  • GCC C以汇编代码的形式产生输出,汇编代码是机器代码的文本表示

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

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

  • 二进制文件可以用od 命令查看,也可以用gdb的x命令查看。
    od code.o | more
    od code.o > code.txt

  • int、long int、所有指针都用双字,浮点数单精度4字节、双精度8字节、扩展精度10字节

  • 代码示例
    命令行中使用-s得到汇编代码,使用-c会编译并汇编
    反汇编器:带-d命令行标志的程序OBJDUMP

  • 数据传送指令
    MOV传送,MOVS符号拓展,MOVZ零拓展
    将一个值从一个存储器位置复制到另一个存储器位置需要两条指令

  • 数据格式

  • 理解操作数的三种类型
    立即数:常数值,表示为$c标准表示的整数
    寄存器:表示某个寄存器的内容
    存储器:根据计算出来的地址访问某个存储器位置

  • 数据传送指令

  • 特殊的算术操作

  • 栈的特点
    后进先出的原则
    push压栈,pop出栈
    栈顶:总是从这端插入和删除元素
    栈顶元素的地址是最低的
    栈指针%esp保存着栈顶元素的地址

  • 四组操作
    加载有效地址:将有效地址写入目的操作数,目的操作数必须是寄存器
    一元操作:只有一个操作数,既是源又是目的
    二元操作:源操作数是第一个,可以是立即数、寄存器、存储器,目的操作数是第二个,可以是寄存器、存储器,但两个不能同时为存储器
    移位:第一个是移位量,用单个字节编码且只允许0-31位的移位,可以是立即数或者放在单字节寄存器%cl中(算术右移SAR,填上符号位/逻辑右移SHR,填上0)目的操作数可以是一个寄存器或存储器

  • 寄存器使用惯例
    程序寄存器组是唯一能被所有过程共享的资源
    %eax、%edx、%ecx被划分为调用者保存寄存器
    %ebx、%esi、%edi被划分为被调用者保存寄存器

教材学习中的问题和解决过程

3.1 题目:将值存放在指明的存储器地址和寄存器中
9(%eax,%edx)
解决方法:根据操作数格式操作数值来计算:ox[9+100+03]=ox10C,地址ox10C对应值为ox11

练习3.33 D
做此题的时候,不太懂%esp和偏移量为+4、+8两个位置存储的数值是如何形成的,通过思考GCC生成的汇编代码,发现是将字符串“%x %x”存储在%esp的位置,同时通过leal命令,将x和y的位置存储在+8、+4的位置

实验过程

本周代码托管截图


https://git.oschina.net/sssqykdky/Linux20145229/tree/week5/

其他(感悟、思考等,可选)

这周的内容牵涉到很多汇编的知识,上学期汇编的生疏让我现在有一点吃力,不过如果把任务分块化就轻松多了,一天看一点点,如果堆积到周末是肯定没有办法快速学习完的,看到哪里就对哪里进行实践,这样的话会对知识有很大的帮助,相信在这样的学习方法中会让人学得更好。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 2/2 20/20
第二周 300/300 3/3 18/18
第三周 96/96 4/4 10/10
第四周 0/0 4/4 0/0
第五周 90/90 5/5 12/12v

参考资料

原文地址:https://www.cnblogs.com/20145229ss/p/5967549.html