• 【汇编语言02】第2章 寄存器——理论知识


    0 前言

    1. 上一章我们了解了汇编语言需要了解的基础知识,包括指令、内存地址、总线等概念。
    2. 本章课程主要是了解在CPU内部寄存器的工作原理。
    3. 注意:为方便复习,本章对内容顺序进行归纳调整,初学者建议按参考文献的课程顺序和视频顺序学习。

    1 寄存器

    1.1 CPU及寄存器概述

    1. 一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。
      (1)运算器:进行信息处理;
      (2)寄存器:进行信息存储;
      (3)控制器:控制各种期间进行工作;
      (4)内部总线:连接各个期间,在它们之间进行数据的传送。
    2. 内部总线与外部总线的区别:
      (1)内部总线实现CPU内部各个器件之间的联系。
      (2)外部总线实现CPU和主板上其它器件的联系。
    3. 寄存器:不同的CPU有不同的结构,寄存器数量也各不相同,寄存器位数也各不相同。
    4. 本课程以8086CPU为代表进行介绍,该CPU有14个寄存器,它们的名称为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

    1.2 通用寄存器

    1. 通用寄存器:通常用来存放一般性数据的寄存器,在8086CPU中主要有AX、BX、CX、DX。
    2. 8086CPU中所有的寄存器都是16位的,可以存放2个字节。

    在这里插入图片描述
    3. 由于8086上一代CPU中的寄存器都是8位的,为保证兼容性,这四个通用寄存器都可以分为两个独立的8位寄存器使用。
    (1)AX可以分为AH和AL;
    (2)BX可以分为BH和BL;
    (3)CX可以分为CH和CL;
    (4)DX可以分为DH和DL。
    在这里插入图片描述

    1.3 字的存储

    1. 出于对兼容性的考虑,8086CPU可以一次性处理一下两种尺寸的数据(更高级别的CPU可以处理更长的数据):
      (1)字节:记为byte,1个字节有8个bit组成,可以存在8位寄存器中。
      (2)字:记为word,1个字有2个字节组成,这2个字节分别称为这个字的高位字节和地位字节。
      (3)1字 = 2字节;
      (4)一个寄存器16位,刚好存1个字;
    2. 理解AX寄存器中字与字节的存储和解析:
    寄存器寄存器中的数据所表示的值
    AX010011100010000020000(4E20H)
    AH0100111078(4EH)
    AL0010000032(20H)

    在这里插入图片描述

    2 物理地址及其形成过程

    2.1 概述

    1. 物理地址:CPU访问内存单元时要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间。我们将这个唯一的地址称为物理地址。
    2. 作用:CPU通过地址总线送入存储器的,必须是一个内存单位的物理地址。在CPU向地址总线发出物理地址之前,必须要在CPU内部先形成这个物理地址。
    3. 物理地址的形成方式:不同的CPU形成物理地址的方式不一样,后续内容以8086CPU为例。

    2.2 16位寄存器与20位地址总线

    1. 问题:对于8086CPU,内部寄存器是16位(只能表达16位的地址),而地址总线宽度是20位,想要形成20位的物理地址,就需要先在内部经过加工处理。
    2. 16位结构描述了一个CPU具有以下几个方面特征:
      (1)运算器一次最多可以处理16位的数据。
      (2)寄存器的最大宽度为16位。
      (3)寄存器和运算器之间的通路是16位的。
    3. 20位的地址总线,可传送20位地址,寻址能力为1M。
    4. 解决方法:在CPU内部,用两个16位地址(段地址+偏移地址)合成的方法来形成一个20位的物理地址。
    5. 解决过程:
      (1)CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;
      (2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
      (3)地址加法器将两个16位地址合并成一个20位的物理地址:物理地址=段地址×16+偏移地址
      (4)地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
      (5)输入输出控制电路将20位物理地址送上地址总线;
      (6)20位物理地址被地址总线传送到存储器。

    在这里插入图片描述
    在这里插入图片描述

    2.3 “段”的理解

    1. “段地址”中包含着“段”的概念,其实内存并没有划分成一个个段,而是表示CPU给一块区域内存起的一个起始地址,是程序逻辑上的划分。
    2. 例子:我们可以认为地址10000H~100FFH的内存单元组成一个段,这个段的起始地址为10000H,段地址为1000H,大小为100H;我们也可以认为地址10000H~1007FH、10080H~100FFH的内存单位组成两个段,他们的起始地址分别为10000H和10080H,段地址为1000H和1008H,大小都为80H。
      在这里插入图片描述
    3. 段的大小:因为CPU寄存器为16位,限制偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的最大长度为64KB。

    3 段寄存器

    1. 用途:段寄存器就是提供段地址的。
    2. 8086CPU有4个段寄存器:CS、DS、SS、ES。当8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址。
    3. 本章先学习CS,其余的后续再学习。

    3.1 CS和IP寄存器

    1. CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址CS:IP
      (1)CS为代码段寄存器;
      (2)IP为指令指针寄存器。
    2. CPU何时将二进制解读为数据何时解读为指令:CPU将CS:IP指向的内存单元中的内容看做指令。
    3. 工作原理
      (1)8086CPU当前状态:CS中的内容为2000H,IP中的内容为0000H;内存20000H~20009H单元存放着可以执行的机器码,对应汇编指令如下:
      (2)从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
      (3)IP=IP+所读取的指令长度,从而执行下一条指令;
      (4)执行命令,跳转到步骤(2),直至程序结束。
    地址内容长度对应汇编指令
    20000H~20002HB8 23 013Bmov ax,0123H
    20003H~20005HB8 03 003Bmov bx,0003H
    20006H~20007H89 D82Bmov ax,bx
    20008H~20009H01 D82Badd ax,bx

    在这里插入图片描述

    3.2 CS、IP寄存器修改

    1. 无法使用的 mov 指令(传送指令):
      对于ax、bx、cx、dx等寄存器,可以使用mov 寄存器,寄存器/值的命令来修改寄存器中的值,但是mov指令不能用于设置CS、IP的值,因为8086CPU没有提供这样的功能,要改变CS、IP内容的指令被统称为转移指令:jmp指令。
    2. 同时修改CS、IP的内容:
      使用jmp 段地址:偏移地址命令,可以同时修改CS、IP内容,指令中给出的段地址修改CS,偏移地址修改IP。
    jmp 2AE3:3
    jmp 3:0B16
    
    • 1
    • 2
    1. 仅修改IP的内容:
      使用命令jmp 某一合法寄存器,用寄存器中的值修改IP。
    jmp ax   (功能上类似于 mov IP,ax,但8086没有提供mov修改IP的功能)
    jmp bx
    
    • 1
    • 2

    3.3 代码段

    1. 编程时:可以根据需要,我们将一组内存单位视为一个段,将一组代码存在一组地址连续、起始地址为16倍数的内存单元中,这样,我们可以认为这一段内存是用来存放代码的,从而定义了一个代码段。
    2. 执行时:编程时人为安排的代码段,CPU并不会理解,CPU只会认被CS:IP指向的内存单元中的内容为指令。所以,要让CPU执行我们放在代码段中的指令,必须将CS:IP指向所定义的代码段中第一条指令的首地址。

    4 本章汇编指令

    4.1 mov指令

    1. 功能:传送指令,用于给某个寄存器或地址赋值。
    2. 格式:mov 寄存器/地址,寄存器/地址/值(待确认其自由组合的可能性)
    3. 例子:
    指令含义备注
    mov ax,18HAX=18H给16位寄存器AX赋值,所赋的值也是16位,内容为0018H
    MOV AX,18HAX=18H汇编语言对大小写不敏感
    mov ax,bxAX=BX给16位寄存器AX赋值,所赋的值也是16位,是BX对应的内容
    mov ah,18HAH=18H给8位寄存器AH赋值,所赋值也是8位,内容为18H
    mov al,18HAL=18H给8位寄存器AL赋值,所赋值也是8位,内容为18H

    4.2 add指令

    1. 功能:用于给某个寄存器加上某个值。
    2. 格式:add 寄存器,寄存器/地址/值(待确认其自由组合的可能性)
    3. 例子:
    指令含义备注
    add ax,18HAX=AX+18H给16位寄存器AX加上18H,如果结果超出16位,超出部分如何存储暂时不考虑
    AX只能保存未超出部分的内容,即16位的内容。
    add al,18HAL=AL+18H同理只能保存8位内容,超出部分不会跑到AH中,如何存储暂不考虑。
    add ax,bxAX=AX+BX把BX的内容加到AX中
    add ax,axAX=AX+AX相当于翻倍

    4.3 jmp指令

    1. 功能:用于改变CS、IP的值。
    2. 格式:jmp 段地址:偏移地址jmp 某一合法寄存器
    3. 例子:
    指令含义备注
    jmp 1000:3CS为1000H,IP为0003H跳转到地址为10003H的位置
    jmp axIP值修改为ax的内容是否能jmp 0003H暂未验证

    5 小结

    1. 了解CPU中寄存器的概念。8086CPU中有14个寄存器,本章主要掌握4个通用寄存器ax、bx、cx、dx,和两个与指令指向相关的寄存器CS、IP。
    2. 掌握修改寄存器的指令:mov、add、jmp。掌握其命令格式、功能,理解其注意事项比如说计算结果超出寄存器所能存储的位数等。
    3. 理解物理地址作用和形成原理。

    参考文献

    1. 《汇编语言(第3版) 》王爽著,主要参考书籍和学习路线。
      百度云:https://pan.baidu.com/s/1TE1Egc0ZmeJfLP5zvamo0Q
      提取码:3y72
    2. 汇编语言百科
    3. 汇编语言基础06》小甲鱼零基础视频课程
    4. 汇编语言基础07》小甲鱼零基础视频课程
    5. 汇编语言基础08》小甲鱼零基础视频课程
    6. 汇编语言基础09》小甲鱼零基础视频课程
    7. 汇编语言基础10》小甲鱼零基础视频课程
  • 相关阅读:
    【实用小功能10】python运行加速神器——numba(详细教学版)
    C++ 右值引用与一级指针
    LeetCode #2.两数相加
    Ubuntu1804 安装后无法使用root登录解决方法
    RN0.70正式发布,快看看更新了什么内容吧
    MySQL:表的创建、删除、修改
    I.MX6U-ALPHA开发板(PWM实验)
    QT汽车客运公司售票系统(改良版)
    电子签名组件Vue
    面试阿里P6,过关斩将直通2面,结果3面找了个架构师来吊打我?
  • 原文地址:https://blog.csdn.net/Fighting_hawk/article/details/126024672