zoukankan      html  css  js  c++  java
  • 汇编语言 (二) 寄存器

    寄存器

    cpu的组成

    一个典型的cpu由运算器、控制器、寄存器等器件构成,这些器件依靠内部总线相连。与cpu内部的总线相对的则是外部总线。

    在cpu中:

    • 运算器进行信息处理
    • 寄存器进行信息存储
    • 控制器控制各种器件进行工作
    • 内部总线连接各种器件,在他们之间进行数据的传送

    汇编程序员通过改变各种寄存器中的内容来实现对cpu的控制。

    不同的cpu,寄存器的个数、机构是不相同的。8086cpu有14个寄存器。

    这些寄存器分别为:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW。

    通用寄存器

    8086的所有寄存器都是16位的,可以存访两个字节。其中AX,BX,CX,DX这四个寄存器通常用来存放一般性的数据,被称为通用寄存器。

    同时为了保证兼容(8086的上代cpu寄存器都为8位),8086cpu的四个通用寄存器都可以分为两个独立使用的8位寄存器来使用。

    UTOOLS1559920669768.png

    AX的低8位构成了AL寄存器,高8位构成了AH寄存器。AH和AL寄存器是可以作为独立使用的8位寄存器。

    AX可分为AH,AL。BX可分为BH,BL,以此类推。

    字在寄存器中的存储

    处于对兼容性的考虑,8086cpu可以一次性处理一下两种尺寸的数据

    1. 字节:byte,可以存放在8位寄存器中
    2. 字:word,一个字由两个字节组成。这两个字节分别称为这个字的高字节和低字节

    比如在AX中,AH和AL中的数据既是分别独立的两个字节,也是AX中字的高字节和低字节。

    几条汇编指令

    UTOOLS1559920534647.png

    同时需要注意,指令的两个操作对象的位数应当是一致的。

    物理地址

    cpu在访问内存单元时,需要给出内存单元的地址。所有的内存单元存储空间是一个以为的线性空间,每个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址。

    cpu通过地址总线送入存储器的,必须是一个内存单元的物理地址。在cpu向地址总线发出物理地址之前,必须要在内部先形成这个物理地址。不同的cpu可以有不同的形成物理地址的方式。

    这里谈到的是8086如何在内部形成物理地址。

    16位结构的cpu

    16位机构(16位机,字长为16),描述了cpu具有下面几个方面的结构特性:

    • 运算器一次最多可以处理16位数据
    • 寄存器的最大宽度位16位
    • 寄存器和运算器之间的通路为16位

    即是说,在8086中,能够一次性处理,传输,暂存的信息的最大长度为16位。

    8086cpu给出物理地址的方法

    8086cpu拥有20位地址总线,可以传送20位地址,达到1MB的寻址能力。但是8086一次能处理的地址为16位。

    所以8086采用在内部使用两个16位地址合成一个20位物理地址的方法。

    物理地址 = 基础地址+偏移地址

    UTOOLS1559920559970.png

    地址加法器做的工作就是使用 段地址*10H+偏移地址 的方法合成物理地址。

    段的概念

    内存物理上并没有段的概念。段的概念来自于8086cpu使用的“基础地址(段地址*16)+ 偏移地址 = 物理地址”获取内存单元物理地址的方式.

    我们将若个个连续的内存单元看成一个数据段,用基础地址(段地址*16)定位段的起始位置。同时因为偏移地址为16为,所以一个段的最大程度为64KB。

    SA*16+EA=物理地址

    段寄存器

    段地址在8086cpu中的四个段寄存器中保存。CS,DS,SS,ES。8086方位内存时由这4个段寄存器提供内存单元的段地址。

    CS和IP

    CS和IP是8086cpu中最关键的两个寄存器.

    CS为代码段寄存器,IP为指令指针寄存器。

    在8086PC机种,任意时刻,设CS内容为M,IP内容为N。8086cpu将从内存M*16+N开始,读取一条指令并执行。
    即,8086机中,任意时刻,cpu将CS:IP指向的内容当作指令执行。

    UTOOLS1559920575679.png

    每当读取一条指令,IP中的偏移值就会自增。增加的大小,取决于指令的长度。

    在8086cpu加电启动或者复位(cpu刚开始工作),CS和IP被设置称为CS=FFFFH,IP=0000H。即8086开机执行的第一条指令为FFFF0H单元起始的指令。

    现在我们可以回答,在内存中,指令和数据没有任何区别,都是二进制数据,cpu如何区分指令和数据。

    cpu将CS:IP指向的内存单元中的内容看作指令,因为8086将CS,IP中的内容当作指令的段地址和偏移地址。如果说内存中的一条信息曾被cpu执行过的话。那么其所在的内存单元一定被CS:IP执行过。

    修改CS,IP的指令

    8086中大部分寄存器的值都可以用mov(传送指令)来改变。但mov指令不能用来设置CS,IP的内容,因为8086没有提供这个功能。

    能够更改CS,IP的内容的指令被统称为转移指令。最简单的转移指令jmp

    1. 想同时更改CS,IP,则采用 jmp 段地址:偏移地址的格式
    2. 如果仅想更改IP的值,则采用jmp 某一合法寄存器的指令来完成。将更改IP的值为指定寄存器中的值

    代码段

    可以根据需要将一组内存单元定义为一段。

    将长度为N(N<= 64KB)的一组代码存在一组连续的,起始位置为16的倍数的内存单元中。我们认为这一段是用来存放代码的,也就是定义了一个代码段。

    使用CS,IP来是cpu执行代码段.

    Debug的使用

    查看,修改cpu中寄存器的内容:R命令

    查看内存中的内容: D命令

    修改内存中的内容:E命令(内存中,指令数据没有区别)

    将内存中的内容解释为机器指令和对应的汇编指令:U命令

    执行CS:IP指向指令:T命令

    以汇编形式向内存写入指令:A命令

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





  • 相关阅读:
    [离散数学]集合3.1、3.2、3.3
    Hadoop YARN ResourceManager 未授权访问漏洞复现
    dns域传送漏洞
    文件包含漏洞详解
    XXE漏洞详解
    常见cms
    IP地址详解
    帧详解
    IP包头内容详解
    SSRF漏洞详解
  • 原文地址:https://www.cnblogs.com/freesfu/p/10993025.html
Copyright © 2011-2022 走看看