深入理解计算机系统(四)
0 Preview
知识点开始聚合了,之前学的都会用到。
学这个是真的煎熬!
立个flag:从今天开始假期内,博客日更!
1 存储模式(字节排序)
关于存储模式,我之前跟着滴水逆向学的时候记过笔记,感觉没有csapp里面详细,就再记一遍。
1.1 代码验证
补充个前提知识,Union(共用体) 数据类型。
结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
🍊共用体采用的是小端存储,所以我们可以提前预想一下程序的运行结果
1 | C |
1.2 字节交换问题
存放在不同的机器间程序移植或数据通信时,会发生一些问题:
音视频和图像等文件格式或处理程序都涉及到字节顺序问题:
ex. Little endian: GIF、PC Paintbrush、Microsoft RTF、etc
Big endian: Adobe Photoshop、JPEG、MacPaint、etc
又是新东西,可以出题整活了。
2 逻辑运算和门电路
2.1 逻辑运算
这个之前写过就不记了。
🌴传送门🌴
2.2 门电路
下图都为一位的门电路,如果逻辑值位数为 “ n " 只需要在箭头上面画个斜杠写个 n 即可。
2.2.1 加法器
本来这个东西我打算跳过的,一遍玩着手机一边听,也听了个大概。太震惊了!
WOC!人类的智慧!加法器的发明太神奇了!
于是我打算从头再学一遍这个东西,👴突然有了兴趣。
这个看一下就行了,感觉和逆向不怎么沾边,但是之前学标志寄存器时候,一直不知道那几个标志位咋来的,就顺手也学一学。
看完上面的这些,我们再回过头看一下之前学的计算机内部部件。
是不是豁然开朗!
3 从 C 表达式到运算类指令
3.1 C语言中的基本数据类型、基本运算类型
—基本数据类型
· 无符号数(二进制位串)、带符号数(补码)
· 浮点数(IEEE 754标准)
· 位串、字符(串)(ASCII码)
—基本运算类型
· 算数( + - * / % > < >= <= == != )
· 按位(| & ~ ^)
· 逻辑(|| && !)
· 移位(<< >>)
· 扩展和截断
3.2 运算流程
简化过的转换流程,和各层次运算:
4 各类运算
4.1 移位运算
4.1.1 例题折磨
这东西可以出题玩玩,放逆向里面,纯恶心人,基础不牢的直接劝退。
4.2 逻辑运算
与按位运算的差别
· 运算过程不同:按位 ~ 整体
· 结果类型不同:位串 ~ 逻辑值(1/0)
4.3 位扩展和位截断运算
—用途
· 类型转换时可能需要数据拓展或截断
—操作
· 没有专门的操作运算符,根据类型转换前、后数据长短确定是扩展还是截断
· 扩展:短转长
无符号数:0扩展(前面补0)
带符号数:符号扩展(前面补符)
4.3.1 例题折磨
OVER
壁纸: