2022-01-13 · 2분
专用寄存器
关于 CPU 专用寄存器的学习笔记——累加器、程序计数器、指令寄存器、MAR、MBR、状态/数据/地址寄存器——以及用户可见与用户不可见的区分。
2021-07-10 · 4분
这篇文章发布已超过两年,内容可能已过时。
寄存器:CPU 的变量

- 通用寄存器:CPU 使用的一种变量
- EAX
进行算术计算并传递返回值。
是最常用的变量。
- EDX
大数的乘法或除法运算
- ECX
C:即 Counter。
充当循环中的计数器、for 循环里 i++ 的角色,但它只以"先存入循环所需的次数值再 递减"的形式工作。
- EBX
和 EAX、EDX、ECX 一样的一种变量
- ESI
用于处理字符串或各种重复数据,或搬移内存。
- EDI
一种变量
ESI 是源索引,EDI 是目的索引
栈(Stack) BOJ #10828 栈问题:https://www.acmicpc.net/problem/10828 什么是栈?栈(Stack)是一种可受限访问的排列结构。是只能在一端存取数据的 LIFO(Last In First Out)形式的.. — nabomhalang.tistory.com
你需要了解栈。
- ESP:stack pointer
存放栈帧终点地址的指针
- EBP:base pointer
存放栈帧起始地址的指针
- EIP:instruction pointer
指向下一条应执行指令地址的指针

endian(字节序)指在计算机内存这样的一维空间中排列多个连续对象的方法,排列字节的方法称为字节顺序。
字节序通常可分为大单位在前的 大端(Big-endian)和小单位在前的 小端(Little-endian);不属于两者或同时支持两者的有时称为 中端(Middle-endian)。
offset:引用特定内存地址时使用方括号。
距 eax +4 的内存地址的表示:[eax+4]
mov a, b:把 b 放进 a。(a = b)
mov [ecx], eax : *ecx = eax
add a, b: 把 a 增加 b(a += b)
sub a, b: 把 a 减少 b(a -= b)
mul a : eax(ax, ah, al) *= a
div a: eax(ax, ah, al) /= a
imul a, b : a *= b
idiv a, b : a /= b
lea a, [b] : 把 [b] 放进 a。(a = [b]) 与 mov 的区别 — mov 赋的是值,lea 赋的是地址
push a: 把 a push 到 stack(esp -= 4)
pop x: 把 stack 上的值 pop 到 a(esp += 4)
Inc a : a++
Dec a : a-- neg a : -a not a : ~a nop : 什么都不做的指令(只有 eip 递增到下一条)
and a, b : a &= b
or a, b : a |= b
xor a, b : a ^= b
对于 xor,执行 xor eax, eax 会把 eax 初始化为 0。
shl a, b : a << b
shr a, b : a >> b
寄存器中存在作为状态寄存器的 flags。
ZF:当此类指令的运算结果为 0 时,zf 标志变为 1
运算结果 == 0 -> '假' -> ZF:1
运算结果 != 0 -> '真' -> ZF:0
CF:在无符号运算中发生进位或借位时,CF 变为 1
SF:在有符号运算中,结果为正时,即最高位为 0 时 SF=0,反之为 1
OF:有符号运算中 CF 的角色(overflow flag)
call location:调用函数的指令,func 是函数的地址
call:push eip; jmp func
push eip:push 函数调用后要返回的地址,此时的 eip 称为(RET)Return address。
jmp location:把 eip 移到 location
释放栈帧的工作
函数结束时,为返回到最初调用该函数的位置而做的工作
- leave
mov esp, ebp:把 esp 对齐为与 ebp 相同(恢复为函数开始时的初始值)
pop ebp:改回原来的 ebp 值
- ret
pop eip:取回 call 时 push eip 的那个 eip
jmp eip:移动到 call 之前的 eip 位置
!> ****](https://nabomhalang.tistory.com/entry/%EB%A6%AC%EB%B2%84%EC%8B%B1-%EC%8A%A4%ED%83%9D%ED%94%84%EB%A0%88%EC%9E%84%EC%9D%B4%EB%9E%80)
补充:[黑客/逆向] - [逆向] 什么是栈帧..? [[逆向] 什么是栈帧..? What's the stack frame? 栈帧(Stack Frame)是指函数被调用时,为区分该函数自己的栈区域而产生的区域。这个空间保存与函数相关的局部变量 — nabomhalang.tistory.com
来源
https://ko.wikipedia.org/wiki/%EC%97%94%EB%94%94%EC%96%B8
原文(韩语): tistory — 发布于 2021-07-10,已迁移至本博客。本翻译由 AI 协助完成。
…