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>、......).o->.out

(五)可执行文件

.out 约等于.exe。

(六)装载

.exe载入内存。

(七)执行

CPU开转。

四、Intel x86-64的寄存器组:

Intel x86-64 架构(也称为AMD64或x64架构)下,寄存器组包括以下几类主要寄存器:

至于这些寄存器的具体介绍,会在另一章节讲解。

通用寄存器(General Purpose Registers)

  1. RAX: 通常用作累加器(Accumulator)
  2. RBX: 基本指针(Base Pointer,用于基址寻址)
  3. RCX: 计数器(Counter,用于循环控制或数组索引)
  4. RDX: 数据寄存器(Data Register,用于 I/O 操作)
  5. RSI: 源索引(Source Index,用于字符串操作)
  6. RDI: 目的索引(Destination Index,用于字符串操作)
  7. RBP: 栈基指针(Stack Base Pointer,用于栈帧定位)
  8. RSP: 栈指针(Stack Pointer,指向当前栈顶)
  9. R8 – R15: 扩展的通用寄存器(用于额外的存储)

段寄存器(Segment Registers)

  1. CS: 代码段寄存器(Code Segment,指向代码段)
  2. DS: 数据段寄存器(Data Segment,指向数据段)
  3. ES: 附加段寄存器(Extra Segment,指向附加数据段)
  4. FS, GS: 额外数据段寄存器(用于特定环境下的段选择,如线程本地存储)

浮点寄存器(Floating Point Registers)

  1. ST0 – ST7: 浮点堆栈寄存器(Floating Point Stack)

SIMD寄存器(SIMD Registers)

  1. XMM0 – XMM15: 128位扩展的多寄存器(用于SSE指令集)
  2. YMM0 – YMM15: 256位扩展的多寄存器(用于AVX指令集)
  3. ZMM0 – ZMM31: 512位扩展的多寄存器(用于AVX-512指令集)

控制寄存器(Control Registers)

  1. CR0 – CR4: 控制寄存器(用于控制处理器的操作模式)
  2. CR8: 中断请求寄存器(Interrupt Request Register)

调试寄存器(Debug Registers)

  1. DR0 – DR7: 用于硬件断点调试

特殊用途寄存器(Special-Purpose Registers)

  1. RIP: 指令指针寄存器(Instruction Pointer,指向将被执行的下一条指令)
  2. 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: 执行并行减法
posted @ 2025-01-29 21:23  minatomorin  阅读(40)  评论(0)    收藏  举报