第二章寄存器
一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。外部总线实现CPU和主板上其他器件的联系。
2.1通用寄存器
8086CPU的所有寄存器都是16位的,可以存放两个字节。
AX、BX、CX、DX这4个寄存器都可分为两个独立可用的8位寄存器
- AX可分为AH和AL
- BX可分为BH和BL
- CX可分为CH和CL
- DX可分为DH和DL
如tuyi
2.2字在寄存器中的储存
-
字节:记为byte,一个字节由8个bit组成,可以存在8位寄存器中 -
字:记为word,一个字由两个字节组成,这两个字节分别称为这两个字的高位字节和低位字节, 字:01001110|00100000 ? 高位字节 低位字节 十六进制表示的数据后面加H,在二进制表示的数据后面加B,十进制后什么都不加
2.3几条汇编指令
汇编指令 | 控制CPU完成的操作 | 用高级语言的语法描述 |
---|
mov ax,18 | 将18送入寄存器AX | AX=18 | mov ah,78 | 将78送入寄存器AH | AH=78 | add ax,8 | 将寄存器AX中的数值加上8 | AX=AX+8 | mov ax,bx | 将寄存器BX中的数据送入寄存器AX | AX=BX | add ax,bx | 将AX和BX中的数据相加结果存在AX中 | AX=AX+BX |
程序段中指令的执行情况
程序段中的指令 | 指令执行后AX中的数据 | 指令执行后BX中的数据 |
---|
mov ax,001AH | 001AH | 0000H | mov bx,0026H | 001AH | 0026H | add al,bl | 0040H | 0026H | add ah,bl | 2640H | 0026H | add bh,al | 2640H | 4026H | mov ah,0 | 0040H | 4026H | add al,85H | 00C5H | 4026H | add al,93H | 0058H | 4026H |
例,使用汇编指令编程计算2的4次方
使用下面3条指令写如2000:0开始的内存单元
mov ax,1
add ax,ax
jmp 2000:0003
2.4物理地址
CPU访问内存单元时,要给出内存单元的地址。所有的内存单元构成的储存空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址。
CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址。在CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。不的CPU可以有不同的形成物理地址的方式。我们现在讨论8086CPU是如何在内部形成内存单元的物理地址。
2.5 16位结构的CPU
我们说8086CPU的上一代CPU(8080、8085)等是8位机,而8086是16位机,也可以说是8086是16位结构的CPU。
对于16位结构CPU的解释:
-
运算器一次最多可以处理16位的数据; -
寄存器的最大宽度为16位; -
寄存器和运算器之间的通路为16位。
2.6 8086CPU给出物理地址的方法
8086CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力。8086CPU又是16位结构,在内部一次性处理、传输、暂时存储的地址为16位。从8086CPU的内部结构来看,如果将地址从内部简单地出发,那么它只能送出16位的地址,表现出的寻址能力只有64KB。
8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址
8086CPU相关部件的逻辑结构如图所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WuOPap0n-1648993596099)(C:\Users\仲以昕\Desktop\屏幕截图 2022-03-31 201802.png)]
- CPU中的相关部件提供两个16位的地址,一个称为段地址另一个称为偏移地址;
- 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
- 地址加法器将两个16位地址合成为一个20位的物理地址;
- 地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
- 输入输出控制电路将20位物理地址送上地址总线;
- 20位物理地址被地址总线传送到存储器。
2.7 段的概念
地址10000H100FFH的内存单元组成一个段,该段的起始地址为1000H,段地址为1000H,大小为100H;我们也可以认为地址10000H1007FH、10080H~100FFH的内存单元组成两个段,他们的起始地址为:10000H和1080H,段地址为1000H和1008H,大小都为80H
2.8 CS和IP
CS和IP是8086CPU中两个最关键的寄存器,它们指示了CPU当前要读取指令的地址。CS为代码段寄存器,IP位指令指针寄存器,从名称上我们可以看出它们和指令的关系。
在8060PC机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。
下图为8086CPU读取、执行指令的工作原理
- 8086CPU当前状态:CS中的内容为2000H,IP中的内容为0000H;
- 内存20000H~20009H单元存放这可执行的机器码;
- 内存20000H~20009H单元中存放的机器码对应的汇编指令如下
地址 | 内容 | 长度 | 对应汇编指令 |
---|
20000H~20002H | B82301 | 3Byte | mov ax,0123H | 20003H~20005H | BB0300 | 3Byte | mov bx,0003H | 20006H~20007H | 89D8 | 2Byte | mov ax,bx | 20008H~20009H | 01D8 | 2Byte | add ax,bx |
8086CPU的工作过程可以简要描述如下
- 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
- IP=IP+所读指令的长度,从而指向下一条指令;
- 执行指令。转到步骤(1),重复这个过程
2.9修改CS、IP的值
程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。
mov指令可以修改AX中的值如 mov ax,123 将AX中值设为123,CPU大部分寄存器的值都可以用mov指令来改变,mov指令被称为传送指令
但是mov指令不能用于设置CS、IP的值,这里引用jmp指令
jmp 2AM3:3,执行后CS=2AE3H,IP=003H,CPU将从 2AE33H 处读取指令
jmp 3:0B16,执行后CS=0003H,CPU将从 00B46H 处读取指令
“ jmp 段地址:偏移地址 ”指令的功能为:用指令中给出的段地址修改CS,偏移地址修改IP
若向仅修改IP的内容,可用形如“jmp 莫一合法寄存器”的指令完成
jmp ax,指令执行前:ax=1000H,CS=2000H,IP=0003H
? 指令执行后:ax=1000H,CS=2000H,IP=1000H
jmp bx,指令执行前:bx=0B16H,CS=2000H,IP=0003H
? 指令执行后: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
- 转到第三步
2.10代码段
我们可以将长度为N(N<=64KB)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中
mov ax,0000 (B8 00 00)
add ax,0123H (05 23 01)
mov bx,ax (8B D8)
jmp bx (FF E3)
这段长度为10个字节的指令,存放在123B0H~123B9H 的一组内存单元中,我们就可以认为,123B0H~123B9H这段内存是用来存放代码的,是一个大妈段,他的段地址为123BH,长度为10个字节
2.11 Debug的使用
-
什么是debug debug是DOS、windows都提供的实模式程序的调试工具。使用它可以查看CPU各种寄存器中的内容,内存的情况在机器码级跟踪程序的运行 -
我们用到的Debug功能
- 用Debug的R命令查看、改变CPU寄存器的内容;
- 用Debug的D命令查看内存中的内容
- 用Debug的E命令改写内存中的内容
- 用Debug的U命令将内存中的机器指令翻译成汇编指令
- 用Debug的T命令执行一条机器指令
- 用Debug的A命令以汇编指令的格式在内存中写入一条机器指令
(1.首先打开DOSBox
(2.输入debug
? -r
CS=0740,IP=0100,内存 0740:0100 处的指令为CPU当前要读取、执行的指令。在所有寄存器的下方,Debug列出了CS:IP所指向的内存单元为 0740:0100,此处存放的机器码为 0000 ,对应的汇编指令为ADD [BX+SI],AL
(3.-r ax (回车后输入1111如下图在输入r)
(4.用Debug的D命令查看内存中的内容
(4.用debug的E命令来改写内存中的内容
也可以用E命令向内存中写入字符串,如用E命令从内存0740:0开始写入:数值1,字符串“c++”、字符3、字符串“IBM” 用E命令将机器码写入内存
机器码 | 对应的汇编指令 |
---|
b80100 | mov ax,0001 | b90200 | mov cx,0002 | 01c8 | add ax,cx | (5.用U命令将内存中的内容翻译为汇编指令 | |
(6.使用debug的T命令可以执行一条或者多条指令,简单地使用T命令可以执行CS:IP指向的指令 解释:我们首先用E命令向从1000:0开始的内存单元中写入了8个字节的机器码;然后用R命令查看CPU中寄存器的状态,可以看到CS=0740H IP=0100H,若要用T命令控制CPU执行我们写到1000:0的指令,必须先让CS:IP指向1000:0,;接着用R命令修改CS、ip中的内容; 之后我们用T命令使得CPU执行我们写到1000:0的指令(执行T命令后,debug显示输出CPU中寄存器状态,AX内容被改为1,IP改为IP+3,) 继续使用T命令 (7.用A命令以汇编指令的形式在内存中写入机器指令
|