• 寄存器各自的作用


    寄存器的用途

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

    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个在一起,就是“相对基址变址寻址”。

  • 相关阅读:
    Kafka 1.0.0集群安装
    java实现以docx格式导出
    基于java处理.docx格式的word合并
    基于java 合并.doc和docx格式的Word文件
    Docker版本Jenkins的使用
    Codeforces 1243 D 0-1 MST
    Public model for matrix
    Codeforces 1220 E Tourism
    Codeforces 1221 G Graph And Numbers
    Codeforces 1221 F Choose a Square
  • 原文地址:https://www.cnblogs.com/raorao1994/p/15946561.html
Copyright © 2020-2023  润新知