寄存器
在CPU中:
运算器进行信息处理;
寄存器进行信息存储;
控制器控制各种器件进行工作;
内部总线连接各种器件,在它们之间进行数据的传送,
本章以8086CPU为例讲解寄存器
2.1通用寄存器
8086CPU的所有寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据,被称为通用寄存器。
寄存器的逻辑结构(以AX为例)
8086CPU的上一代CPU中的存器都是8位的,为了保证兼容,使原来基于上代CPU 编写的程序稍加修改就可以运行在8086之上,8086CPU的AX、BX、CX、DX这4个寄存器都可分为两个可独立使用的8位寄存器来用:
AX 可分为 AH 和 AL:
BX可分为 BH 和 BL;
CX 可分为CH 和CL;
DX 可分为 DH 和 DL
以AX为例:
16 位寄存器及所分成的两个8位寄存器的数据存储情况:
2.2字在寄存器中的存储
字节:记为byte,一个字节由8个bit组成,可以存在8位寄存器中。
字:记为word,一个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节。
十六进制数据表示:由于一个存储单元可存放8位数据,CPU中的寄存器又可存放n个8位的数据。也就是说,计算机中的数据大多是由1~N个8位数据构成的。很多时候,需要直观地看出组成数据的各个字节数据的值,用十六进制来表示数据可以直观地看出这个数据是由哪些8位数据构成的。比如20000写成4E20 就可以直观地看出,这个数据是由4E和20两个8位数据构成的,如果AX中存放4E20,则AH里是4E,AL里是20。这种表示方法便于许多问题的直观分析。在以后的课程中,我们多用十六进制来表示一个数据。
2.3几条汇编指令
例1:
指令不区分大小写。执行上述指令后,数据变化如下:
AX数据为044CH。分析:程序段中的最后一条指令 add ax,bx,在执行前 ax和bx中的数据都为8226H,相加后所得的值为:1044CH,但是ax为16位寄存器,只能存放4位十六进制的数据,所以最高位的1不能在ax中保存,ax中的数据为:044CH。
例2:
AX数据为0058H。分析:程序段中的最后一条指令 add al,93H,在执行前,al中的数据为C5H,相加后所得的值为:158H,但是al为8位寄存器,只能存放两位十六进制的数据,所以最高位的1丢失,ax中的数据为:0058H。此时al是作为一个独立的8位寄存器来使用的,和ah没有关系。
在进行数据传送或运算时,指令的两个操作对象的位数应当是一致的,
错误示例:
mov ax bl (在8位寄存器和16位寄存器之间传送数据)
mov bh ax (在16位寄存器和8位寄存器之间传送数据)
mov al 20000 (8位寄存器最大可存放值为255的数据)
add al 100H (将一个高于8位的数据加到一个8位寄存器中)
检测点2.1
1.写出每条汇编指令执行后相关寄存器中的值
F4A3H 31A3H 3123H 6246H 826CH 6246H
汇编指令 | 值 |
mov ax,62627 | AX=F4A3H |
mov ah,31H | AX=31A3H |
mov al,23H | AX=3123H |
add ax,ax | AX=6246H |
mov bx,826CH | BX=826CH |
mov cx,ax | CX=6246H |
mov ax,bx | AX=826CH |
add ax,bx | AX=04D8H |
mov al,bh | AX=0482H |
mov ah,bl | AX=6C82H |
add ah,ah | AX=D882H |
add al,6 | AX=D888H |
add al,al | AX=D810H |
mov ax,cx | AX=6246H |
2.只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方
mov ax,2H
add ax,ax
add ax,ax
add ax,ax
2.4物理地址
所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址。
CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址。在CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。
2.5 16 位结构的 CPU
结构特性:
运算器一次最多可以处理16位的数据;
寄存器的最大宽度为16位;
寄存器和运算器之间的通路为16位。
内存单元的地址在送上地址总线之前,必须在CPU中处理、传输、暂时存放,对于16位 CPU,能一次性处理、传输、暂时存储 16 位的地址。
2.6 8086CPU给出物理地址的方法
8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
逻辑结构:
如上图所示,当8086CPU要读写内存时:
- CPU 中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;
- 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
- 地址加法器将两个16位地址合成为一个20位的物理地址;
- 地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
- 输入输出控制电路将20位物理地址送上地址总线;
- 20位物理地址被地址总线传送到存储器。
地址加法器采用物理地址=段地址x16+偏移地址的方法用段地址和偏移地址合成物理地址。例如,8086CPU要访问地址为123C8H的内存单元,地址加法器的工作过程如图所示(图中数据皆为十六进制表示)。
“段地址x16”有一个更为常用的说法是左移4位。计算机中的所有信息都是以二进制的形式存储的,段地址当然也不例外。机器只能处理二进制信息,“左移4位”中的位,指的是二进制位。
观察上面移位次数和各种形式数据的关系,我们可以发现:
(1)一个数据的二进制形式左移1位,相当于该数据乘以2;
(2)一个数据的二进制形式左移N位,相当于该数据乘以2的N次方;
(3)地址加法器如何完成段地址x16的运算?就是将以二进制形式存放的段地址左移4位。
一个X进制的数据左移1位,相当于乘以X
2.7“段地址x16+偏移地址=物理地址”的本质含义
段地址x16+偏移地址=物理地址”的本质含义是:CPU在访问内存时,用一个基础地址(段地址x16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
“基础地址+偏移地址=物理地址”
举例说明:
2.8 段的概念
用分段的方式来管理内存。地址连续的内存单元看作一个段,用段地址x16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。
例:
图1地址10000H~100FFH的内存单元组成个段,该段的起始地址(基础地址)为10000H,段地址为1000H,大小为100H;图2地址10000H~1007FH、10080H~100FFH的内存单元组成两个段,它们的起始地址(基础地址)为:10000H和10080H,段地址为:1000H和1008H,大小都为80H。
有两点需要注意:段地址x16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB。
小结
结论1:CPU可以用不同的段地址和偏移地址形成同一个物理地址。
比如 CPU 要访问 21F60H单元,则它给出的段地址 SA 和偏移地址 EA满足SAX16+EA=21F60H 即可。
结论2:偏移地址16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可寻64KB个内存单元。
比如给定段地址1000H,用偏移地址寻址,CPU的寻址范围为:10000H~1FFFFH。
结论3:存储单元的地址用两个元素来描述,即段地址和偏移地址。
比如“数据在 21F60H内存单元中。” 应表述为 ①数据存在内存2000:1F60单元中:②数据存在内存的2000H段中的1F60H单元中。
检测点2.2
1.给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为到00010H~1000FH
分析:物理地址=SA*16+EA
最小值: 0001H*16+0H=00010H
最大值: 0001H*16+FFFFH=1000FH
2.有一数据存放在内存 20000H单元中,现给定段地址为 SA,若想用偏移地址寻到此单元。则SA应满足的条件是:最小为1001H,最大为2000H
分析:20000H=SA*16+EA
最大值: 20000H=SA*16+0H ==> SA*16=20000H
最小值: 20000H=SA*16+FFFFH ==> SA*16=10001H 结果与段地址的定义冲突,是无效地址,所以要往右找最近的符合定义的有效地址为10010H,倒推到段地址即为1001H。
3.反过来思考一下,当段地址给定为多少,CPU无论怎么变化偏移地址都无法寻到 20000H单元?
SA>2000H或SA<1000H
分析:20000H=SA*16+EA
EA的取值范围是0H~FFFFH
当SA*16+0>20000H时, 得到SA>2000H
当SA*16+FFFFH<20000H时, 得到SA<1000H
2.9段寄存器
段地址在8086CPU的段寄存器中存放。4个段寄存器:CS、DS、SS、ES。
2.10 CS 和 IP
CS为代码段寄存器,IP为指令指针寄存器,设CS中的内容为M,IP中的内容为N,8086CPU将从内存 Mx16+N单元开始,读取一条指令并执行。CPU将CS:IP指向的内容当作指令执行。
工作原理:
- 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
- IP=IP+所读取指令的长度,从而指向下一条指令;
- 执行指令。转到步骤(1),重复这个过程。
工作过程:
初始状态:
(1)CS中的内容为2000H,IP中的内容为0000H;
(2)内存 20000H~20009H单元存放着可执行的机器码;
(3)内存20000H~20009H单元中存放的机器码对应的汇编指令如下。
地址:20000H~20002H,内容:B8 23 01,长度:3Byte,对应汇编指令:mov ax,0123H
地址:20003H~20005H,内容:BB 03 00,长度:3Byte,对应汇编指令:mov bx,0003H
地址:20006H~20007H,内容:89 D8,长度:2Byte,对应汇编指令:mov ax,bx
地址:20008H~20009H,内容:01 D8,长度:2Byte,对应汇编指令:add ax,bx
CS:2000H,IP:0000H,CPU将从内存2000Hx16+0000H处读取指令执行
CS、IP中的内容送入地址加法器(地址加法器完成:物理地址=段地址X16+偏移地址)
地址加法器将物理地址送入输入输出控制电路
输入输出控制电路将物理地址 20000H送上地址总线
从内存 20000H 单元开始存放的机器指令B8 23 01通过数据总线被送入CPU
输入输出控制电路将机器指令 B8 23 01送入指令缓冲器
IP 中的值自动增加。读取一条指令后,IP 中的值自动增加,以使 CPU可以读取下一条指令。因当前读入的指令 B8 23 01长度为3个字节,所以IP 中的值加 3。此时,CS:IP指向内存单元2000:0003。
执行控制器执行指令 B8 23 01(即 mov ax,0123H)
指令 B8 23 01 被执行后 AX 中的内容为 0123H
在8086CPU加电启动或复位后(即CPU开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H,即在8086PC机刚启动时,CPU从内存FFFFOH单元中读取指令执行,FFFFOH单元中的指令是8086PC机开机后执行的第一条指令。
2.11 修改 CS、IP 的指令
若想同时修改CS、IP的内容,可用形如“jmp段地址:偏移地址”的指令完成,如
jmp 2AE3:3,执行后:CS=2AE3H,IP-0003H,CPU将从2AE33H处读取指令。
jmp 3:0B16,执行后:CS=0003H,IP=0B16H,CPU将从00B46H处读取指令。
“jmp 段地址:偏移地址”指令的功能为:用指令中给出的段地址修改CS,偏移地址修改 IP。
若想仅修改IP的内容,可用形如“jmp某一合法寄存器”的指令完成,如
jmp ax,指令执行前:ax=1000H,CS=2000H,IP=0003H
指令执行后:ax=1000H,CS=2000H,IP=1000H
指令执行前:bx=0B16H,CS=2000H,IP=0003Hjmp bx,
指令执行后:bx=0B16H,CS=2000H,IP=0B16H
“jmp 某一合法寄存器”指令的功能为:用寄存器中的值修改IP。
例:写出指令执行序列
- mov ax,6622H
- jmp 1000:3
- mov ax,0000
- mov bx,ax
- jmp bx
- mov ax,0123H
- 转到第3步执行
分析:
- 当前 CS=2000H,IP-0000H,则CPU从内存2000HX16+0=20000H处读取指读入的指令是:B82266(mov ax,6622H),读入后IP=IP+3=0003H;
- 指令执行后,CS=2000H,IP=0003H,则CPU从内存2000HX16+0003H=20003H处读取指令,读入的指令是:EA03000010jmp1000:0003),读入后IP=IP+5=0008H:
- 指令执行后,CS=1000H,IP=0003H,则CPU从内存1000HX16+0003H=10003H处读取指令,读入的指令是:B80000(movax.0000),读入后IP=IP+3=0006H;
- 指令执行后,CS=1000H,IP=0006H,则CPU从内存1000Hx16+0006H=10006H 处读取指令,读入的指令是:8BD8(movbx,ax),读入后IP=IP+2=0008H;
- 指令执行后,CS=1000H,IP=0008H,则CPU从内存1000HX16+0008H=10008H处读取指令,读入的指令是:FFE3(jmpbx),读入后IP=IP+2=000AH;
- 指令执行后,CS=1000H,IP=0000H,CPU从内存10000H处读取指令
2.12 代码段
将长度为N(N≤64KB)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。
要让CPU执行我们放在代码段中的指令,必须要将CS:IP指向所定义的代码段中的第一条指令的首地址。
检测点2.3
下面的3条指令执行后,CPU几次修改IP?都是在什么时候?最后IP中的值是多少?
mov ax,bx
sub ax,ax
jmp ax
4次。IP值为ax=0000H。
分析:读取指令后CPU立刻修改IP,jmp ax读取完成时IP已修改三次,执行jmp ax时将ax的值赋给了IP,所以一共修改了4次。
标签:16,汇编语言,IP,笔记,地址,指令,寄存器,ax,CPU From: https://blog.csdn.net/2201_75602177/article/details/143390990