CSAPP读书笔记(一)
事情是这样的,前几天无意间刷到了魔改手机主题的视频,涉及到了root权限、fastboot等内容。
除了root在以前捣鼓Ubuntu云服务器时(为了开Minecraft服务器,当然。)略知一二,其他可以说是完全不懂,
所谓需求促进技术发展,兴趣促使我去学习一些有关现代计算机(手机也是计算机)的知识,这篇笔记就由此诞生了。
一、大端序和小端序
大端序就是高位在前,小端序就是低位在前。例如0x12345678,大端序存储就是 12 34 56 78,小端序就是78 56 34 12。
学过OI的朋友应该容易理解小端序的好处:要是想加位,只要在最后一位添加即可。而大端序还需要进行移位。
二、机器码
众所周知指令也是2进制。现今指令集架构是x86(-64),ARM,RISC-V。
一些概念:
Instructure Set Architecture:
指令集架构 (包括指令规格,寄存器等),简称ISA,它是软硬件之间的“合同”
Mircoarchitecture:
指令集架构的具体实现方式 (比如流水线级数,缓存大小等),它是可变的
Machine Code:
机器码,也就是机器可以直接执行的二进制指令
Assembly Code:
汇编码,也就是机器码的文本形式 (主要是给人类阅读)
三、编译过程
C语言程序的编译过程:源代码 -> 编译 -> 汇编 -> 链接 -> 可执行文件 -> 装载 -> 执行
(一)源代码:
打OI的人写的代码。保存.c文件。
(二)编译
将源代码转化为汇编代码。.c->.s。
(三)汇编
将汇编代码转化为机器指令。.s->.o。
(四)链接
将所用的库链接起来(<stdio.h>、
(五)可执行文件
.out 约等于.exe。
(六)装载
.exe载入内存。
(七)执行
CPU开转。
四、Intel x86-64的寄存器组:
Intel x86-64 架构(也称为AMD64或x64架构)下,寄存器组包括以下几类主要寄存器:
至于这些寄存器的具体介绍,会在另一章节讲解。
通用寄存器(General Purpose Registers)
- RAX: 通常用作累加器(Accumulator)
- RBX: 基本指针(Base Pointer,用于基址寻址)
- RCX: 计数器(Counter,用于循环控制或数组索引)
- RDX: 数据寄存器(Data Register,用于 I/O 操作)
- RSI: 源索引(Source Index,用于字符串操作)
- RDI: 目的索引(Destination Index,用于字符串操作)
- RBP: 栈基指针(Stack Base Pointer,用于栈帧定位)
- RSP: 栈指针(Stack Pointer,指向当前栈顶)
- R8 – R15: 扩展的通用寄存器(用于额外的存储)
段寄存器(Segment Registers)
- CS: 代码段寄存器(Code Segment,指向代码段)
- DS: 数据段寄存器(Data Segment,指向数据段)
- ES: 附加段寄存器(Extra Segment,指向附加数据段)
- FS, GS: 额外数据段寄存器(用于特定环境下的段选择,如线程本地存储)
浮点寄存器(Floating Point Registers)
- ST0 – ST7: 浮点堆栈寄存器(Floating Point Stack)
SIMD寄存器(SIMD Registers)
- XMM0 – XMM15: 128位扩展的多寄存器(用于SSE指令集)
- YMM0 – YMM15: 256位扩展的多寄存器(用于AVX指令集)
- ZMM0 – ZMM31: 512位扩展的多寄存器(用于AVX-512指令集)
控制寄存器(Control Registers)
- CR0 – CR4: 控制寄存器(用于控制处理器的操作模式)
- CR8: 中断请求寄存器(Interrupt Request Register)
调试寄存器(Debug Registers)
- DR0 – DR7: 用于硬件断点调试
特殊用途寄存器(Special-Purpose Registers)
- RIP: 指令指针寄存器(Instruction Pointer,指向将被执行的下一条指令)
- RFLAGS: 标志寄存器(Flags Register,包含状态及控制标志)
五、基础指令集
x86-64基础指令集包括以下几个主要类别的指令,每个类别中的指令执行不同的低级操作:
这些指令集会在另一章节进行详细讲解。
数据传输指令(Data Transfer Instructions)
- MOV: 将数据从一个位置移动到另一个位置
- PUSH: 将数据压入栈
- POP: 从栈中弹出数据
- LEA: 加载有效地址
- XCHG: 交换两个操作数的值
算术指令(Arithmetic Instructions)
- ADD: 执行加法操作
- SUB: 执行减法操作
- INC: 增量(加 1)
- DEC: 减量(减 1)
- MUL: 无符号乘法
- IMUL: 带符号乘法
- DIV: 无符号除法
- IDIV: 带符号除法
- NEG: 求补码
- CMP: 比较两个操作数
逻辑指令(Logical Instructions)
- AND: 执行按位与操作
- OR: 执行按位或操作
- XOR: 执行按位异或操作
- NOT: 按位取反
- TEST: 执行位测试
移位和旋转指令(Shift and Rotate Instructions)
- SHL/SAL: 算术左移
- SHR: 逻辑右移
- SAR: 算术右移
- ROL: 循环左移
- ROR: 循环右移
控制流指令(Control Flow Instructions)
- JMP: 无条件跳转
- JE/JZ: 跳转如果相等/零
- JNE/JNZ: 跳转如果不相等/非零
- JG/JNLE: 跳转如果大于
- JL/JNGE: 跳转如果小于
- CALL: 调用子程序
- RET: 从子程序返回
字符串指令(String Instructions)
- MOVS: 移动字符串
- CMPS: 比较字符串
- SCAS: 扫描字符串
- LODS: 加载字符串
- STOS: 存储字符串
访问状态标志指令(Status Flag Access Instructions)
- STC: 设置进位标志
- CLC: 清除进位标志
- CMC: 取反进位标志
- STD: 设置方向标志
- CLD: 清除方向标志
特权指令(Privileged Instructions)
- HLT: 停止处理器执行
- NOP: 无操作(空操作)
- CLI: 禁用中断
- STI: 启用中断
SIMD指令(SIMD Instructions)
- MOVD: 移动双字
- MOVQ: 移动四字
- PADD: 执行并行加法
- PSUB: 执行并行减法

浙公网安备 33010602011771号