linux-寄存器

📅 发布时间:2026/7/12 1:08:55 👁️ 浏览次数:
linux-寄存器
在 x8632位架构中寄存器是 CPU 内部存储数据的“核心阵地”。为了方便理解我们可以将常用的寄存器分为四组。随着 64 位x64的普及这些寄存器在名字前加了 R如 RAX但逻辑功能依然延续。1. CPU 四组核心寄存器第一组通用寄存器 (General Purpose Registers)这组寄存器最常用主要用于算术运算和数据传送。EAX (Accumulator)累加器。它是很多加减乘除指令的默认寄存器也是函数返回值的存放地。EBX (Base)基址寄存器。常用于内存寻址时存放基地址。ECX (Count)计数器。在循环LOOP指令或字符串操作中用来记录剩余次数。EDX (Data)数据寄存器。在长整数乘除法中与 EAX 配合使用也常用于 I/O 端口操作。第二组变址/指针寄存器 (Index Pointer Registers)这组寄存器主要负责“定位”即寻找内存地址。ESI / EDI (Source/Destination Index)源/目的变址寄存器。常用于字符串拷贝把数据从 ESI 指向的地址搬到 EDI 指向的地址。EBP (Base Pointer)栈底指针。指向当前函数栈帧的底部是访问局部变量的参照点。ESP (Stack Pointer)栈顶指针。永远指向当前堆栈的最顶部。第三组指令指针与标志寄存器EIP (Instruction Pointer)指令指针我们之前聊过。指向 CPU 下一步要执行的指令地址。EFLAGS状态标志寄存器。它不是存数值的而是存“状态”。比如ZF (Zero Flag)上一步计算结果是否为 0。CF (Carry Flag)是否有进位。SF (Sign Flag)结果是正还是负。第四组段寄存器 (Segment Registers)在现代保护模式下它们通常指向段描述符表。CS (Code)代码段。DS (Data)数据段。SS (Stack)堆栈段。ES/FS/GS附加段常用于特殊内存寻址如 Linux 内核用 GS 存储 Per-CPU 变量。2. 常用汇编指令基础六大类掌握了寄存器指令就是操作它们的“动词”。A. 数据传送类MOV eax, 10把 10 放到 EAX。PUSH eax把 EAX 的值压入堆栈ESP 减小。POP ebx从栈顶弹出一个值送到 EBXESP 增大。LEA eax, [ebx4]取地址指令。把 ebx4 计算出的地址值给 EAX而不是去取那个地址里的数据。B. 算术运算类ADD eax, ebxeax eax ebx。SUB eax, 1eax eax - 1。INC / DEC自增 1 或自减 1常用于循环。CMP eax, ebx比较两个数。本质是做减法但不保存结果只影响 EFLAGS 标志位。C. 逻辑运算类AND / OR / XOR与、或、异或。TEST逻辑比较。常用于检查某个位是否为 1比如 TEST eax, eax 常用来判断 EAX 是否为 0。D. 控制流类改变 EIPJMP label无条件跳转。JZ / JNZ结果为 0 跳转 / 结果不为 0 跳转依赖 ZF 标志。CALL / RET调用函数 / 从函数返回。CALL 会自动把当前的 EIP 压栈。3. 实战案例C 语言与汇编的转化如果你写一句 C 语言a b 1;汇编视角下的动作可能是这样的代码段mov eax, [ebp-8] ; 从内存局部变量b加载到寄存器EAXadd eax, 1 ; EAX加1mov [ebp-4], eax ; 将结果存回内存局部变量a4. 历史趣闻为什么寄存器名字这么怪在 1970 年代的 8086 时代寄存器只有 16 位AX, BX...。到了 80386 时代Intel 升级到了 32 位。为了兼容老代码他们没有改名而是在前面加了个 EExtended。AX 是 16 位。AL 是 AX 的低 8 位Low。AH 是 AX 的高 8 位High。EAX 是整个 32 位。