当前位置: 首页 > article >正文

汇编语言(1)——寄存器

文章目录

    • 1.通用寄存器
    • 2.字在寄存器中存储
    • 3.确定物理地址的方法
    • 4.内存分段表示法
    • 5.CS、IP寄存器及代码段
    • 6.jmp指令

1.通用寄存器

    8086中的所有寄存器都是16位的,可以存放两个字节,AX、BX、CX、DX这四个寄存器用来存放一般性的数据,统称为通用寄存器
在这里插入图片描述
    由于8086的上一代cpu其寄存器是8位的,因此也可以将寄存器分为两个独立的8位寄存器来使用,如下所示。
在这里插入图片描述

2.字在寄存器中存储

    cpu可以对两种尺寸的数据进行一次性处理:

  1. 字节:byte,由8个bit组成,存放在8位寄存器中;
  2. 字:word,由两个字节组成。
    在这里插入图片描述

3.确定物理地址的方法

    所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,这个地址称为物理地址。cpu通过地址总线送入存储器的必须是一个内存单元的物理地址,因此首先在cpu内部形成物理地址。
    8086被称为16位机,那是因为在8086内部,一次性处理、传输、暂存的信息的最大长度为16位,因此,能一次性处理、传输、暂存16位的地址。但是8086有20位地址总线,其寻址能力达到了1MB,因此需要采用两个16位地址合成的方法来形成一个20的物理地址。
在这里插入图片描述
    如上图所示,cpu想要读写内存的步骤如下:

  • cpu中部件提供两个地址:段地址偏移地址
  • 段地址和偏移地址通过内部总线送入地址加法器
  • 地址加法器将两个16位地址合成一个20位地址;
  • 地址加法器通过内部总线将20位地址送入输入输出控制电路
  • 输入输出控制电路将物理地址送到地址总线;
  • 物理地址被地址总线送到存储器中。

    地址加法器的工作流程如下:
在这里插入图片描述

4.内存分段表示法

    如下图所示,cpu将内存进行段的划分,即将若干地址连续的内存单元看作一个段,将段地址左移4位就是定位段的起始地址,用偏移地址确定具体的内存单元。
在这里插入图片描述
    如上图左边所示,段的起始地址为10000,而结束地址为100FF,其大小为100;右边将该段分为更小的两端,大小都为80。段地址一定是16的倍数,这是因为物理地址是由段地址*16+偏移地址得到的,而偏移地址是16位的,因此一个段的最大长度为16KB。

5.CS、IP寄存器及代码段

    CS和IP寄存器是8086CPU中最关键的两个寄存器:CS为代码段寄存器,IP为指针指令寄存器。在任意时刻,CPU将地址为CS:IP指向的内容当做指令执行。如下图所示,即为CPU读取、执行指令的工作原理。
在这里插入图片描述
    初始状态,CPU中CS寄存器为2000,IP寄存器为0。
在这里插入图片描述
    CS、IP中的内容送入地址加法器。
在这里插入图片描述
    地址加法器将物理地址送入输入输出电路。
在这里插入图片描述
    控制电路将物理地址送上地址总线。
在这里插入图片描述
    内存20000单元处的内容被从数据总线传送到CPU中。
在这里插入图片描述
    控制电脑将指令B8 23 01传送到指令缓冲器。
在这里插入图片描述
    读取一条指令后,IP的值自动增加。
在这里插入图片描述
    指令B8 23 01被执行。
在这里插入图片描述
    指令执行后AX寄存器中内容被改变。

6.jmp指令

    在CPU中,程序员能够用指令读写的部件只有寄存器,通过改变寄存器中的内容来控制CPU,CPU执行的指令位置是由CS、IP寄存器中的内容决定的,通过改变这两个寄存器的内容就可以控制CPU执行目标指令。可以通过jmp指令来修改CS:IP的内容。
    如果想同时修改CS:IP的内容,可用“jmp段地址:偏移地址”的指令完成:
    jmp 2AE:3,执行后CS的值为2A3E,IP的值为0003,CPU会从2AE33处读取指令。
    如果仅仅修改IP中的内容,可以用“jmp 一个合法寄存器”的指令完成:
    jmp ax,如果ax=1000,那么IP中的内容也会变为1000。
    (本文中的内容改编与王爽老师《汇编语言》)


http://www.kler.cn/a/4441.html

相关文章:

  • Docker--Docker Compose(容器编排)
  • TCP 连接状态标识 | SYN, FIN, ACK, PSH, RST, URG
  • Onedrive精神分裂怎么办(有变更却不同步)
  • idea 自动导包,并且禁止自动导 *(java.io.*)
  • 为深度学习创建PyTorch张量 - 最佳选项
  • docker虚拟机平台未启用问题
  • 编写python的smtplib库发送邮件代码(简洁-原创)
  • js中generator详解
  • C++之引用
  • 类ChatGPT平台推荐【国内访问ChatGPT4】
  • eNSP 本地AAA配置实验
  • <class ‘sensor_msgs.msg._Image.Image‘>原理
  • Apache iotdb-web-workbench 认证绕过漏洞 CVE-2023-24829
  • Exception 和 Error
  • Pytorch梯度下降——up主:刘二大人《PyTorch深度学习实践》
  • 【HTB】Responder思路——Responder抓取ntlmhash、远程文件包含、远程代码执行、evil-winrm连接
  • 文件操作练习
  • Python中关于字典和Counter()的两点区别
  • PCB模块化设计06——HDMI接口PCB布局布线设计规范
  • 推荐5款精致小巧无广告的软件
  • 【深度学习】常见优化算法的NumPy和PyTorch实现
  • WebRTC技术分析
  • 【C语言蓝桥杯每日一题】——跑步锻炼
  • SpringBoot启动流程源码分析一、入口参数研究和创建对象
  • python基础篇:什么是装饰器?装饰器有什么用?
  • 【设计模式】单例模式