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 |