当前位置:网站首页>【汇编语言02】第2章 寄存器——理论知识
【汇编语言02】第2章 寄存器——理论知识
2022-08-03 17:53:00 【Fighting_hawk】
目录
0 前言
- 上一章我们了解了汇编语言需要了解的基础知识,包括指令、内存地址、总线等概念。
- 本章课程主要是了解在CPU内部寄存器的工作原理。
- 注意:为方便复习,本章对内容顺序进行归纳调整,初学者建议按参考文献的课程顺序和视频顺序学习。
1 寄存器
1.1 CPU及寄存器概述
- 一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。
(1)运算器:进行信息处理;
(2)寄存器:进行信息存储;
(3)控制器:控制各种期间进行工作;
(4)内部总线:连接各个期间,在它们之间进行数据的传送。 - 内部总线与外部总线的区别:
(1)内部总线实现CPU内部各个器件之间的联系。
(2)外部总线实现CPU和主板上其它器件的联系。 - 寄存器:不同的CPU有不同的结构,寄存器数量也各不相同,寄存器位数也各不相同。
- 本课程以8086CPU为代表进行介绍,该CPU有14个寄存器,它们的名称为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。
1.2 通用寄存器
- 通用寄存器:通常用来存放一般性数据的寄存器,在8086CPU中主要有AX、BX、CX、DX。
- 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 字的存储
- 出于对兼容性的考虑,8086CPU可以一次性处理一下两种尺寸的数据(更高级别的CPU可以处理更长的数据):
(1)字节:记为byte,1个字节有8个bit组成,可以存在8位寄存器中。
(2)字:记为word,1个字有2个字节组成,这2个字节分别称为这个字的高位字节和地位字节。
(3)1字 = 2字节;
(4)一个寄存器16位,刚好存1个字; - 理解AX寄存器中字与字节的存储和解析:
寄存器 | 寄存器中的数据 | 所表示的值 |
---|---|---|
AX | 0100111000100000 | 20000(4E20H) |
AH | 01001110 | 78(4EH) |
AL | 00100000 | 32(20H) |
2 物理地址及其形成过程
2.1 概述
- 物理地址:CPU访问内存单元时要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间。我们将这个唯一的地址称为物理地址。
- 作用:CPU通过地址总线送入存储器的,必须是一个内存单位的物理地址。在CPU向地址总线发出物理地址之前,必须要在CPU内部先形成这个物理地址。
- 物理地址的形成方式:不同的CPU形成物理地址的方式不一样,后续内容以8086CPU为例。
2.2 16位寄存器与20位地址总线
- 问题:对于8086CPU,内部寄存器是16位(只能表达16位的地址),而地址总线宽度是20位,想要形成20位的物理地址,就需要先在内部经过加工处理。
- 16位结构描述了一个CPU具有以下几个方面特征:
(1)运算器一次最多可以处理16位的数据。
(2)寄存器的最大宽度为16位。
(3)寄存器和运算器之间的通路是16位的。 - 20位的地址总线,可传送20位地址,寻址能力为1M。
- 解决方法:在CPU内部,用两个16位地址(段地址+偏移地址)合成的方法来形成一个20位的物理地址。
- 解决过程:
(1)CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;
(2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
(3)地址加法器将两个16位地址合并成一个20位的物理地址:物理地址=段地址×16+偏移地址。
(4)地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
(5)输入输出控制电路将20位物理地址送上地址总线;
(6)20位物理地址被地址总线传送到存储器。
2.3 “段”的理解
- “段地址”中包含着“段”的概念,其实内存并没有划分成一个个段,而是表示CPU给一块区域内存起的一个起始地址,是程序逻辑上的划分。
- 例子:我们可以认为地址10000H~100FFH的内存单元组成一个段,这个段的起始地址为10000H,段地址为1000H,大小为100H;我们也可以认为地址10000H~1007FH、10080H~100FFH的内存单位组成两个段,他们的起始地址分别为10000H和10080H,段地址为1000H和1008H,大小都为80H。
- 段的大小:因为CPU寄存器为16位,限制偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的最大长度为64KB。
3 段寄存器
- 用途:段寄存器就是提供段地址的。
- 8086CPU有4个段寄存器:CS、DS、SS、ES。当8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址。
- 本章先学习CS,其余的后续再学习。
3.1 CS和IP寄存器
- CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址CS:IP。
(1)CS为代码段寄存器;
(2)IP为指令指针寄存器。 - CPU何时将二进制解读为数据何时解读为指令:CPU将CS:IP指向的内存单元中的内容看做指令。
- 工作原理
(1)8086CPU当前状态:CS中的内容为2000H,IP中的内容为0000H;内存20000H~20009H单元存放着可以执行的机器码,对应汇编指令如下:
(2)从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
(3)IP=IP+所读取的指令长度,从而执行下一条指令;
(4)执行命令,跳转到步骤(2),直至程序结束。
地址 | 内容 | 长度 | 对应汇编指令 |
---|---|---|---|
20000H~20002H | B8 23 01 | 3B | mov ax,0123H |
20003H~20005H | B8 03 00 | 3B | mov bx,0003H |
20006H~20007H | 89 D8 | 2B | mov ax,bx |
20008H~20009H | 01 D8 | 2B | add ax,bx |
3.2 CS、IP寄存器修改
- 无法使用的 mov 指令(传送指令):
对于ax、bx、cx、dx等寄存器,可以使用mov 寄存器,寄存器/值
的命令来修改寄存器中的值,但是mov指令不能用于设置CS、IP的值,因为8086CPU没有提供这样的功能,要改变CS、IP内容的指令被统称为转移指令:jmp指令。 - 同时修改CS、IP的内容:
使用jmp 段地址:偏移地址
命令,可以同时修改CS、IP内容,指令中给出的段地址修改CS,偏移地址修改IP。
jmp 2AE3:3
jmp 3:0B16
- 仅修改IP的内容:
使用命令jmp 某一合法寄存器
,用寄存器中的值修改IP。
jmp ax (功能上类似于 mov IP,ax,但8086没有提供mov修改IP的功能)
jmp bx
3.3 代码段
- 编程时:可以根据需要,我们将一组内存单位视为一个段,将一组代码存在一组地址连续、起始地址为16倍数的内存单元中,这样,我们可以认为这一段内存是用来存放代码的,从而定义了一个代码段。
- 执行时:编程时人为安排的代码段,CPU并不会理解,CPU只会认被CS:IP指向的内存单元中的内容为指令。所以,要让CPU执行我们放在代码段中的指令,必须将CS:IP指向所定义的代码段中第一条指令的首地址。
4 本章汇编指令
4.1 mov指令
- 功能:传送指令,用于给某个寄存器或地址赋值。
- 格式:
mov 寄存器/地址,寄存器/地址/值
(待确认其自由组合的可能性) - 例子:
指令 | 含义 | 备注 |
---|---|---|
mov ax,18H | AX=18H | 给16位寄存器AX赋值,所赋的值也是16位,内容为0018H |
MOV AX,18H | AX=18H | 汇编语言对大小写不敏感 |
mov ax,bx | AX=BX | 给16位寄存器AX赋值,所赋的值也是16位,是BX对应的内容 |
mov ah,18H | AH=18H | 给8位寄存器AH赋值,所赋值也是8位,内容为18H |
mov al,18H | AL=18H | 给8位寄存器AL赋值,所赋值也是8位,内容为18H |
4.2 add指令
- 功能:用于给某个寄存器加上某个值。
- 格式:
add 寄存器,寄存器/地址/值
(待确认其自由组合的可能性) - 例子:
指令 | 含义 | 备注 |
---|---|---|
add ax,18H | AX=AX+18H | 给16位寄存器AX加上18H,如果结果超出16位,超出部分如何存储暂时不考虑 AX只能保存未超出部分的内容,即16位的内容。 |
add al,18H | AL=AL+18H | 同理只能保存8位内容,超出部分不会跑到AH中,如何存储暂不考虑。 |
add ax,bx | AX=AX+BX | 把BX的内容加到AX中 |
add ax,ax | AX=AX+AX | 相当于翻倍 |
4.3 jmp指令
- 功能:用于改变CS、IP的值。
- 格式:
jmp 段地址:偏移地址
、jmp 某一合法寄存器
- 例子:
指令 | 含义 | 备注 |
---|---|---|
jmp 1000:3 | CS为1000H,IP为0003H | 跳转到地址为10003H的位置 |
jmp ax | IP值修改为ax的内容 | 是否能jmp 0003H暂未验证 |
5 小结
- 了解CPU中寄存器的概念。8086CPU中有14个寄存器,本章主要掌握4个通用寄存器ax、bx、cx、dx,和两个与指令指向相关的寄存器CS、IP。
- 掌握修改寄存器的指令:mov、add、jmp。掌握其命令格式、功能,理解其注意事项比如说计算结果超出寄存器所能存储的位数等。
- 理解物理地址作用和形成原理。
参考文献
边栏推荐
- Cool open technology x StarRocks: unified OLAP analysis engine, comprehensive building digital model of OTT
- 【机器学习】机器学习基本概念/术语3
- 酷开科技 × StarRocks:统一 OLAP 分析引擎,全面打造数字化的 OTT 模式
- 【engine】RtcSyncCallback回调、回调容器RtcCallbackContainer及MediaPacketSenderImpl 中回调使用
- Share 14 JS functions you must know
- PMP试题 | 每日一练,快速提分
- cell delay and net delay
- 【技术白皮书】第二章:OCR智能文字识别回顾——自然语言文本发展历程
- mysql之数据库账户管理与优化
- IP属地如何高效率识别
猜你喜欢
随机推荐
酷开科技 × StarRocks:统一 OLAP 分析引擎,全面打造数字化的 OTT 模式
【牛客在线OJ】-字符逆序
mysql之数据库账户管理与优化
基于PHP7.2+MySQL5.7的回收租凭系统
WPF 实现柱形统计图
PMP考试通关宝典-敏捷专题
STM32——LCD—FSMC原理简介
@resource和@autowired的区别
LeetCode - 102. 二叉树的层序遍历;110. 平衡二叉树;098. 验证二叉搜索树
Oracle备份的几种方式
六、用户身份认证
如何成为优秀的产品运营?
Share 14 JS functions you must know
动态接口比例性能测试实践
你想知道的 Watch App 开发
SkyWalking概要介绍
MVCC多版本并发控制的理解
【mysql】SIGN(x)函数
图像质量指标:PSNR、SSIM、MSE
WPF implements column chart