• 汇编语言



    $0(0000)、$1(0001)、$2(0010)、$3(0011)、$4(0100)、$5(0101)、$6(0110)、$7(0111 )
    $8(1000)、$9(1001)、$A(1010)、$B(1011)、$C(1100)、$D(1101)、$E(1110)、$F(1111)

    esp定律指的也是堆栈平衡原理,esp是x86用于保存栈顶指针的寄存器
    ```
    ```
    通用寄存器 |16位 |32位 |64位
    ---------------------------
    累加寄存器 |AX |EAX |RAX
    基址寄存器 |BX |EBX |RBX
    计数寄存器 |CX |ECX |RCX
    数据寄存器 |DX |EDX |RDX
    堆栈基指针 |BP |EBP |RBP
    变址寄存器 |SI |ESI |RSI
    堆栈顶指针 |SP |ESP |RSP
    指令寄存器 |IP |EIP |RIP
    ```
    ```
    8位的半寄存器(通用寄存器)AH、AL、BH、BL、CH、CL、DH、DL
    16位指针寄存器:IP
    32位指针寄存器:EIP
    16位段寄存器:CS、DS、SS、ES(FS、GS)
    标识寄存器:flags/eflags
    16位段寄存器,主要功能是将其用于存储段地址 eax,ebx,ecx,edx;ax,bx,cx,dx;ah,al,bh,bl,ch,cl,dh,dl
    ```
    ```
    IP和EIP专用指针寄存器,存储当前代码段中下一条即将执行的机器指令的偏移地址
    ```
    ```
    一般寄存器:AX、BX、CX、DX
    AX:累积暂存器,BX:基底暂存器,CX:计数暂存器,DX:资料暂存器
    索引暂存器:SI、DI
    SI:源索引暂存器,DI:目的索引暂存器
    ```
    ```
    指针寄存器: 堆栈指针寄存器SP、stack pointer; 基数指针寄存器BP、base pointer
    值寄存器包括: 源变址寄存器SI、source index; 目的变址寄存器DI、destination index
    4个寄存器都是16位寄存器,这些寄存器在运算过程中也可以用来存放操作数(只能以字为单位),但经常的用途是在段内寻址时提供[偏移地址]
    SP,BP一般与段寄存器SS联用,以确定堆栈寄存器中某一单元的地址,SP用以指示栈顶的[偏移地址],而BP可作为堆栈区中的一个基地址,用以确定在堆栈中的操作数地址。
    SI,DI一般与段寄存器DS联用,以确定数据段中某一存储单元的地址,SI,DI具有自动增量和自动减量的功能,这一点使在串操作指令中用做变址非常方便,SI作为隐含的源变址DS联用,DI作为隐含的目的变址和ES连用,从而达到在数据段和附加段中寻址的目的

    ```
    ```
    ESP 专门用作堆栈指针,被形象地称为栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP也就越来越小。在32位平台上,ESP每次减少4字节。
    EBP 是"基址指针"(BASE POINTER), 它最经常被用作高级语言函数调用的"框架指针"(frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码:

    ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
    EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。

    esp:寄存器存放当前线程的栈顶指针
    ebp:寄存器存放当前线程的栈底指针
    eip:寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。
    ```
    ```
    4个数据寄存器(EAX、EBX、ECX和EDX)
    32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
    对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
    4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
    ```
    ```
    eax是32位寄存器,ax是16位寄存器,al(ah)是八位寄存器。那么eax存储的数据就是ax的两倍,ax是al(ah)的两倍。
    eax可以存储的是DWORD(双字)ax存储的是WORD(字)AL(AH)存储的是BYTE(字节),那么为什么又有AH和AL呢,我们可以这样理解,AX=AH+AL,AH存储的是AX的高8位数据,AL存储的是AX的低八位数据。H这里就是HIGH,L就是LOW.

    ```
    ```
    位:数据的最小单元是一位、一位只能表示两个不同的数值(0或1),
    半字节:是4位一组的数据类型、
    字节(byte):一个字节由8位组成、是最小可编址数据单元、8086的主存和I/O地址都是字节地址、
    字(word):是一个16位的组、2个字节
    双字(dword):是一个32位的组、由两个字组成、
    四字(qword):是一个64位的组、由四个字组成、
    长字(lword):是一个128位的组、由八个字组成、
    ```
    ```
    与运算、或运算、异或运算、非运算
    计算机只会一种运算、那就是位运算
    ```
    ```
    movb(8位)、movw(16位)、movl(32位)、movq(64位)
    寄存器寻址: movl %eax, %edx
    ```
    ```
    mov指令种类:1.普通的mov指令 2.做符号扩展的movs 3.做零扩展的movz
    ```

  • 相关阅读:
    Hadoop、Spark和Storm
    bro安装过程(纪念其中遇到的坑)
    tensorflow中出现{TypeError}unhashable type: 'numpy.ndarray'
    Python高级函数(map,reduce,cmp,filter,闭包,lambda )
    Java中设置百分数保留两位小数
    查看python支持的whl文件类型
    js 图表转图片
    dorado 7 使用总结
    Socket 接收本地短连接并转发为长连接 多线程
    java Socket 长连接 心跳包 客户端 信息收发 demo
  • 原文地址:https://www.cnblogs.com/xiaofeifei-wang/p/10492858.html
Copyright © 2020-2023  润新知