• eax ...edi esp ebp寄存器简介(转)


    首先介绍我们会经常看到的一些寄存器:
    4个数据寄存器(EAXEBXECXEDX)
    2
    个变址和指针寄存器(ESIEDI)
    2个指针寄存器(ESPEBP)


    4个数据寄存器(EAXEBXECXEDX)
    32CPU432位的通用寄存器EAXEBXECXEDX。对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AXBXCXDX,它和先前的CPU中的寄存器相一致。
    416位寄存器又可分割成8个独立的8位寄存器(AXAH-ALBXBH-BLCXCH-CLDXDH-DL),每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。

    那么如何理解eax,ax,al(ah)之间的关系呢?
    专业点可以这样解释:Eax32位寄存器,ax16位寄存器,al(ah)是八位寄存器。
    那么eax存储的数据就是ax的两倍,axal(ah)的两倍。
    Eax可以存储的数字是DWORD(双字)ax存储的是WORD(字)AL(AH)存储的是BYTE(字节),那么为什么又有AHAL呢,我们可以这样理解,AX=AH+ALAH存储的是AX的高8位数据,AL存储的是AX的低八位数据。H这里就是HIGH,L就是LOW.
    假设eax是红色区域,那么eax现在就是64636261
    那么ax就是eax的低十六位,也就是6261
    Al61AH62
    eax <wbr>...edi <wbr>esp <wbr>ebp寄存器简介(转)



    其他ebxecxedx也有类似的bx,bl,bh等对应的寄存器,原理和上面相同。

    在用途方面,他们有各自默认的用途:
    Eax用来保存所有API函数的返回值。
    寄存器AXAL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;
    寄存器BX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 
    寄存器CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;
    寄存器DX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。

    由于存储的数据大小关系,AXBXCXDX不能作为基址和变址寄存器来存放存储单元的地址, 32位寄存器EAXEBXECXEDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。(什么是基址,什么是变址以后会说到)

    2个变址和指针寄存器(ESIEDI)
    32CPU232位通用寄存器ESIEDI。其低16位对应先前CPU中的SIDI,对低16位数据的存取,不影响高16位的数据。

    寄存器ESIEDISIDI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
    变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。

    2个重要的指针寄存器(ESPEBP)


    这两个指针寄存器都和“栈”这个神秘的东东有关,那么什么是栈呢?这俩指针寄存器又有何作用呢?


    从计算机科学的角度看,栈是一种数据结构,是一种先进后出的数据表。栈的最常见操作有两种:Push(入栈)和Pop(出栈)。


    我们可以把栈想象成一摞扑克牌:
    PUSH:为栈增加一个元素的操作是push,相当于在这摞扑克牌最上面再放一张

    POP:从栈中取出一个元素的操作叫做POP,相当于从这摞扑克牌取出最上面的一

    张。

    TOP:标识栈顶位置,并且是动态变化的。每做一次PUSH 操作,它都会自增1

    相反,每做一次POP 操作,它会自减1。栈顶元素相当于扑克牌最上面一张,只有


    这张牌的花色是当前可以看到的。

    BASE:标识栈底位置,它记录着扑克牌最下面一张的位置。BASE 用于防止栈空后

    继续弹栈(牌发完时就不能再去揭牌了)。很明显,一般情况下,BASE 是不会变动


    的。

    用王爽《汇编语言》中的图说明一下push和pop操作
    代码如下:
    mov ax,0123H
    push ax
    mov bx,2266H
    push bx
    mov cx,1122H
    pop ax
    pop bx
    pop cx

    mov是传送数据的指令,mov ax,0123H表明把0123H这个值给ax
    H代表0123是十六进制数

    eax <wbr>...edi <wbr>esp <wbr>ebp寄存器简介(转)



    mov是传送数据的指令,mov ax,0123H表明把0123H这个值给ax
    H代表0123是十六进制数
    图中左边的10000H等数值表明内存地址
    箭头指向栈顶位置

     

    那么针对此例栈底就是1000FH
    栈顶由于入栈和出栈操作在不断变化。

    那么在这里栈底1000FH就是BP 栈顶(不断变化的箭头)就是SP
    (BP和SP分别是16位下的寄存器,与ebp,esp类似)

    内存的栈区实际上指的就是系统栈。系统栈由系统自动维护,它用于实现高级语言中函

    数的调用。对于类似C 语言这样的高级语言,我们无需担心他们是如何操作的。一般说来,只有在使用汇编语言的时候,才需要和它直接打交道。

    那么ESP和EBP指的分别是什么呢?

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



    本次重点内容:了解几个常见的寄存器名字,记住eax一般用来保存函数的返回值,记住esp是栈顶指针寄存器,ebp是栈底指针寄存器。

  • 相关阅读:
    centOS7下安装GUI图形界面
    centos7 安装VMware Tools 遇到的一系列问题的解决方案
    centos7 更新源 安装ifconfig
    隐写 小案例
    linux shell脚本编程笔记(二): 分支结构
    strncmp memcmp区别
    linux shell脚本编程笔记(一): 构建基本脚本
    linux: sort排序数据 grep搜索数据
    C/C++控制台输出时设置字体及背景颜色
    boost.asio包装类st_asio_wrapper开发教程(转)
  • 原文地址:https://www.cnblogs.com/lihaozy/p/2124315.html
Copyright © 2020-2023  润新知