【汇编语言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. 仅修改IP的内容:
    使用命令jmp 某一合法寄存器,用寄存器中的值修改IP。
jmp ax   (功能上类似于 mov IP,ax,但8086没有提供mov修改IP的功能)
jmp bx

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》小甲鱼零基础视频课程
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值