前言
就是按照考试的题型写的总结 非常应试版
题型
一、进制转换
只考 十进制 二进制 十六进制 之间的相互转换 一个个看
(1)十进制 转其他
- 转二进制:除以2 从小到大取余数(0或1)
- 转十六进制 : 除以16 从小到大取余数 (0到f)
(2)二进制 十六进制 转十进制
每位数字乘以相应的幂数再相加
(3)二进制与十六进制的互相转换
二进制的四位对应十六进制的一位
二、 位运算 逻辑运算
(1)位运算
转换成二进制数 做如下运算
(2)逻辑运算
如果是 !或者&& 就按正常的非零或者零计算就行(例如!a ,a为非零数 那么结果为0)
(3)无符号数的比较
首先补码得转换成无符号数
-1 对应的无符号数是有符号数最大值加一
对应转换准则如下:
三、大端序小端序
就是把十六进制数 按每一个字节填写两个十六进制位的格式以及大小端的顺序(从左还是从右开始)放入
大端序就是比较舒服 不用改顺序的填入即可
比如下图给定0x01234567 大端序就是直接往里填即可
其实上面三个题型涉及的知识都在我的笔记3里 需要的自行查看
四、寄存器的值(地址计算)
- 注意一下存储器寻址的计算
- 以及注意区别寄存器取地址和存储器取地址
五、据汇编指令写C代码
- 一般考比较常见的mov指令 push、pop指令(进栈出栈)以及jx指令(跳转 条件)sub指令 cmp指令(比较指令)call指令 ret指令
- 注意一下后缀
以上两个题型在我的笔记11以及笔记12里可以找到,不熟悉的建议回溯一下(进出栈的正在写)
六、符号解析
链接的内容(也正在写T_T)
稍微回顾一下
- 全局符号
由模块m定义的并能被其他模块所引用
例如:非static的C函数和非static的全局变量
全局符号包括强符号和弱符号- 强符号:函数和已初始化的全局变量
- 弱符号:未初始化的全局变量
- 符号链接规则:在链接过程中,符号出现重名的情况时:
◼规则1:不允许有多个同名的强符号,每个强符号只能被定义一次,否则链接失败
◼规则2:如果有一个强符号和多个弱符号同名,那么选择强符号,对弱符号的引用被解析为强符号
◼规则3:如果有多个弱符号同名,那么从这些弱符号中任意选择一个,可以通过gcc –fno-common选项重定义这一条规则(生成一个警告)
- 局部符号
只能被模块m定义和引用的符号
例如:使用static关键字修饰的C函数和变量
局部符号不是局部变量 - 外部符号
由其他模块定义并被模块m中引用的全局符号
下面是符号解析的一个例子
七、内存布局
内存分布以及结构体对齐
八、一些计算
1.流水线的性能(延迟与吞吐率)
请看笔记7
2.磁盘的容量与平均访问时间
- 容量
- 磁盘访问时间
请看笔记8
3.高速缓存平均访问时间计算
平均访问时间 = 未命中率*未命中惩罚 + 命中率 * 命中时间
请看笔记9
九、一些重要概念的考察
- 存储器层次结构的特点
- 攻击缓冲区溢出漏洞所采用的主要手段
- 栈随机化 不可执行段 栈金丝雀
- 程序的局部性原理
- switch 语句在汇编语言水平上的主要实现思路
- 读高速缓存
例题
一、据汇编指令写C代码
这个就是考察了mov 结合下面的C代码我们可以分析出寄存器与局部变量的对应关系
*xp - %ebp+8
*yp - %ebp+12
t0 - %edx
t1 - %ecx
xp - %ebx
yp - %eax
由此
*xp = t1;
*yp = t2;
x-%ebp+8 - %edx
y - %ebp+12 - %eax
result - %ebp
跳转指令那里等价于 y <x则跳转L6
所以是 result = x - y
否则就是 result = y - x(跳转指令后面的指令)
(结果存到栈中)
二、内存布局
嵌套数组地址从小到大可以表示为 2 0 6 2 1 3 2 1 7 2 2 1
(题目中的表示相当于二维数组 pgh[4][3],按照行优先原则分配内存地址)
结构体对齐 跟嵌套数组是同一篇笔记
PS
还有两章没写完的 明天再赶一下 博主觉得难的就是概念的默写(?)以及按照汇编指令写C代码这块 内存布局的作画上也稍微有点难度
复习建议就是加强概念的掌握kk 后续应该还会再编辑一下这篇笔记的概念这部分 剩下的大家自己加油^^