CSAPP-程序的机器级表示

文章目录

概念扫盲

1.汇编代码使用文本格式,相较于汇编的二进制可读性更好

2.程序内存包括:可执行的机器代码、操作系统需要的信息、管理过程调用和返回的运行时栈、用户分配的内存块

3.链接器为函数调用找到匹配的可执行代码的位置

4.x86-64中传送指令不能都指向内存位置

5.x86-64中任何寄存器生成的32位值的指令都会把该寄存器的高位设置为0

6.cltq指令将%eax符号扩展到%rax的所有位中

7.乘法指令的参数一个由源操作数给出,一个放在%rdx中。结果存放在%rdx和%rax中

8.有符号除法指令idivl将寄存器%rdx(高64)和%rax(低64)中的128位作为被除数,除数作为指令的操作数给出。商存储在寄存器%rax中,余数存储在%rdx中

9.SIMD(单指令多数据),允许多个操作以并行模式执行

10.指针NULL表示指针没有指向任何地方

11.蠕虫可以自己运行并且将等效副本传播,病毒是添加到操作系统在内的程序中,不能独立运行

12.安全单一化指许多系统容易受到同一种病毒的攻击

13.ASLR(地址空间布局随机化-Address-Space Layout Randomization)每次程序运行时各部分加载到不同区域,可以被穷举攻击(nop sled)

14.canary值,来自金丝雀在矿洞中察觉有毒气体。用于检测栈是否被破坏,即哨兵值

15.所有XMM寄存器都是调用者保存,被调用可以随意覆盖这些寄存器

16.函数参数指针和整数通过寄存器传递,浮点值通过XMM寄存器传递。参数到寄存器的映射取决于类型和排列顺序

思想理解

1.C预处理器扩展源码(include指定文件,扩展define声明的宏),编译器产生汇编,汇编产生目标文件(所有指令的二进制表示,无全局地址),连接器将代码与实现库函数合产生可执行文件

2.反汇编器只是基于机器代码文件中的字节序列来确定汇编代码,不需要访问源代码或者汇编代码

3.x86-64中内存引用总是以四字长的寄存器给出,哪怕只是一字节

4.当switch语句情况数量比较多且范围跨度较小时使用跳转表

5.栈调用通过寄存器最多传递6个整数值,更多参数可以由调用者在自身栈帧存储

6.PC相对寻址是相对本身地址的后面一条指令进行的

7.一个联合的总大小等于它最大字段的大小,将互斥的字段声明为联合可以减少空间的使用

8.奇偶校标志位断最近一次算数逻辑运算产生值的最低位字节是否有偶数个一。在浮点数比较时可以判断是否有操作数是NaN

经典好图

x86规则:生成1字节和2字节的指令保持剩下字节不变,4字节将高位4个字节置0

复杂寻址模式对于数组、结构元素相当有用

不同的数据传送指令的转换关系

set指令集合,jump类似

当前正在执行过程的栈总是在栈顶,返回地址是调用者管理

指针作为参数占8个字节

数组的指针运算

管理变长栈帧,x86-64使用%rbp作为栈指针

浮点体系简介

安全事件

1.1988年著名蠕虫病毒:对finger守护进程fingerd进行缓冲区溢出攻击,造成远程守护进程溢出并执行代码

相关推荐
微三云 - 廖会灵 (私域系统开发)1 天前
新零售分销系统架构思考:基于核销 + 积分闭环的渠道商业模式设计
系统架构·零售
希赛网2 天前
2026年下半年软考系统架构设计师考试案例模拟题汇总
系统架构·系统架构设计师·软考系统架构设计师·系统架构设计师考试·2026年下半年软考·系统架构设计师考试案例题
Cicada1282 天前
复杂度到底从哪来的?
系统架构
ZJU_统一阿萨姆3 天前
【算子开发】矩阵乘法(GEMM)入门与共享内存优化
人工智能·线性代数·矩阵·系统架构
ZJU_统一阿萨姆4 天前
【算子开发】扫描(Scan)与前缀和
开发语言·arm开发·架构·系统架构·硬件架构
skr爱码士4 天前
05_Qt 核心模块概览——Qt Core、Gui、Widgets、Quick 的职责划分
c++·qt·系统架构·客户端
一几文4 天前
2026年上半年软考高级-系统架构设计师考试真题回顾与解析-综合知识选择题6
小程序·架构·系统架构·软考高级·软考·it证书
海水冷却4 天前
私有化 vs 混合云 vs 公有云:双录系统架构怎么选
系统架构·双录
Cicada1284 天前
为什么从 demo 到生产路还很长?一次数据拉取功能的复杂度演进复盘
系统架构
xcl09255 天前
树洞社交应用的系统架构设计与匿名实现
java·spring boot·系统架构