寄存器各自的作用

寄存器的用途

  • 可将寄存器内的数据执行算术及逻辑运算。
  • 存于寄存器内的地址可用来指向内存的某个位置,即寻址。
  • 可以用来读写数据到电脑的周边设备。

ESP EBP ESI EDI 它们可以像数据寄存器一样在运算过程中存放操作数,但它们只能使用16位。其实他们通常的用途是在段内寻址时提供偏移地址。

寄存器 作用
EAX 累加器,算数运算的主要寄存器。
ECX 计数器,在循环指令和传处理指令中当作计数器。
EDX 数据寄存器,一般在做双字长运算时把 EDX 和 EAX 组合在一起放一个双字长数,EDX用来存放高位数字。
EBX 通常作为内存偏移指针使用(相对于EAX、ECX、EDX)基址寄存器。
EBP

基址指针寄存器,可作为堆栈区中的基值地址以便访问堆栈中的其他信息。这也是一个作为指针的寄存器。通常,它被高级语言编译器用以建造‘堆栈帧’来保存函数或过程的局部变量

EBP:用来表示

  参数     [ebp+0x4*(n+1)] n表示第几个参数

  局部变量   [ebp-0x4*n] n表示第几个局部变量

ESP 堆栈指针寄存器,表示栈顶的偏移地址。记录当前堆栈的使用情况(用到哪儿了)
ESI 变址寄存器,原地址指针寄存器,一般与 EDS配合使用,有自动增减量的功能。MOVS指令中的源地址指针
EDI 变址寄存器,目的地址指针寄存器,一般与 EDS 配合使用,有自动增减量的功能。MOVS指令中的目的地址指针
EIP 指向CPU当前执行的代码位置
那现在来讲讲我们脱壳时候经常看到了PUSHAD和POPAD
PUSHAD是将 8 个32位通用寄存器的内容顺序入栈。入栈顺序是EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
这时候入栈的ESP数据是执行PUSHAD之前的值。执行该指令后,ESP 值减 32 (十进制32)

POPAD是将当前堆栈内容顺序弹出,ESP 也恢复原来的值,即加32。然后是PUSHA与POPA,其实都一样,只不过就是16位的。
入栈顺序是:AX,CX,DX,BX,SP,BP,SI,DI,执行完成后同样SP 值减 16 (十进制16)POPA也是和32位一样,只不过SP不是加32,而是加16。
 

6个段寄存器

6个段寄存器,分别是干什么的?
CS 代码段(存放代码段的段地址)
DS 数据段(存放数据段的段地址)
ES 附加数据段
SS 堆栈段(存放堆栈段的段地址)
FS 附加段
GS 附加段

标志寄存器

我们通常看他们的值来控制跳转成功与否。他们受到比较与运算的影响来变换数值,从而让跳转成功或失败。

C 进位标志,记录运算结果的符号,结果为负数时则1,否则 0
P 奇偶标志,用来为机器中传送信息时可能产生的代码出错情况听歌检验条件。当结果操作数中 1 的个数为偶数时置 1,否则置 0
A 辅助进位标志位
Z 零标志,运算结果为 0 时 ZF 位置 1,否则置 0
S 符号标志,记录运算结果的符号,结果为负时置 1,否则置 0
T 中断允许标志位,由  CLI,STI 两条指令来控制
D 向量标志位,由  CLD,STD  两条指令来控制
O 溢出标志,在操作数超出了计算能表示的范围称为溢出

 寻址

然后我们说说“寻址”的那些事
立即寻址,这种寻址方式下,操作数以常量的形式出现在指令中
比如下图,JMP Shark恒.00513426
意思是无条件跳转到内存00513426处,其中00513426是立即数。这叫做立即寻址。

存储器寻址分为直接寻址与间接寻址。
直接寻址是带方括号的常量或是变量。DS是操作数默认的段寄存器。
如下图所示,BA520073处的内容与ah寄存器相加后,结果给BA520073

寄存器间接寻址
下图内容是DS为数据段段地址,edi寄存器的内容为偏移地址,与al做比较。

寄存器相对寻址
什么是相对寻址? 就是在间接寻址的基础上和立即数做一个加法运算。请看下图

基址变址寻址
也很容易理解,就是基址+变址在方括号里,如下图
什么是基址,什么是变址,我们在刚才讲过了,可以向上看。

相对基址变址寻址
这名字真长啊,不过也很好理解。
还记得刚才的寄存器相对寻址吗?方括号内有个立即数与寄存器做加法,就叫寄存器相对寻址。如果没有立即数做加法,那就叫寄存器间接寻址。
然后结合我们刚才的基址变址寻址,我们在与一个立即数做加法,请看下图。

前面2个寄存器相加,我们学过了,叫基址变址寻址,然后又加上一个立即数,我们管他叫“相对”,那3个在一起,就是“相对基址变址寻址”。

posted @ 2022-02-28 17:15  扰扰  阅读(1168)  评论(0编辑  收藏  举报