第二章 寄存器
第二章 寄存器2.0绪论
1. CPU组成:运算器、控制器、寄存器,这些器件靠内部总线相连。
2. 内部总线实现CPU内部各个器件之间的联系。
3. 外部总线实现CPU和主板上其它器件的联系。
4. 运算器进行信息处理
5. 寄存器进行信息存储
6. 控制器控制各种器件进行工作
7. 内部总线连接各种器件,在它们之间进行数据的传送
8. 8086CPU共14个:AX BX CX DX SI DI SP BP IP CS SS DS ES PSW
2.1通用寄存器
1.8086CPU的所有寄存器都是十六位的
2. AX BX CX DX为4个通用寄存器,存放一般性的数据
3.
8086四个通用寄存器可以分为8个8位寄存器使用
·AX分为 AH AL
·BX分为BH BL
·CX分为CH CL
·DX分为DH DL
·AX的低8位构成AL寄存器,高8位构成AH寄存器
2.2字在寄存器中的存储
1.8086字长(word size)为16bit
2. 在汇编语言中16进制数后加H,二进制后加B,十进制后什么都不加
2.3几条汇编指令
***汇编指令不区分大小写***
1.mov指令用于传送数据
add指令为加法指令
2.在问题2.1中,相加后的结果为1044ch,而ax为16位寄存器,不能保存最高位1,所以ax=044ch。
3.在问题2.2中,相加后得到值为158h,但是al为8位寄存器,最高位1丢失,所以al=58h.(注该进位值并没有被丢弃,只是在CPU的其他地方)
4.在执行指令时,al作为一个独立的寄存器使用,与ah没有关系。add al,93H进行8位计算,进位不会被保存在ah中。
5.在进行数据传送和运算时,指令两个操作对象的位数应当相同。
检测点 2.1
(1) 写出每条汇编指令执行后相关寄存器中的值。
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,2 AX=2
add ax,ax AX=4
add ax,ax AX=8
add ax,ax AX=16
2.4~2.8086中的地址、段的概念
1. 每个内存单元在内存地址空间中都有一个唯一的地址,叫做物理地址
2. 16位CPU的结构特性
·运算器一次最多可以处理16位的数据
·寄存器的最大宽度为16位
·寄存器和运算器之间的通路为16位
->对于16位的CPU,能一次性处理、传输、暂时存储16位的地址
3.8086CPU使用两个地址合成20位地址,其中,一个叫段地址、一个叫偏移地址。
地址加法器采用
物理地址=段地址*16+偏移地址的方法合成物理地址。(相当于段地址在二进制下左移4位,亦即在16进制下左移1位,再与偏移地址相加得到物理地址)
4.一个数据的二进制形式左移1位,相当于该数乘2.以其二进制形式左移N位,相当于该数据乘以2的N次方。
5.一个R进制的数据左移1位,相当于乘R
6.可将段地址*16看作基地址
7.内存并未分段,段的划分来自CPU。
8.一个段的起始地址为16的倍数,一个段长度最大为64KB
9.不同的段地址和偏移地址可以形成同一物理地址。
10.SA:OA表示段地址为SA,偏移地址为OA的内存
检测点2.2
(1) 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为 0010H 到 1000FH 。
解题过程:
物理地址=SA*16+EA
EA的变化范围为0h~ffffh
物理地址范围为(SA*16+0h)~(SA*16+ffffh)
现在SA=0001h,那么寻址范围为
(0001h*16+0h)~(0001h*16+ffffh)
=0010h~1000fh
2.9~2.12 代码段寄存器CS、CS和IP、修改CS和IP
1. 段地址在段寄存器中存放。8086的段寄存器:CS、DS、SS、ES
2. CS为代码段寄存器、IP为指令指针寄存器
3. 任意时刻,CPU将CS:IP指向的内容作为指令执行
4. 8086CPU读取、执行指令的过程
(1)
从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
(2) IP=IP+所读取指令的长度,从而指向下一条指令
(3) 执行指令。转到步骤(1),重复此过程。
5.8086CPU加电复位后CS=FFFFH,IP=0000H,FFFF0H单元是8086CPU开机后执行的第一条指令。
6.mov指令为传送指令
7.mov无法修改CS和IP。用于改变CS和IP的指令叫做转移指令
8.jmp指令
(1)修改CS:IP jmp 段地址:偏移地址
(2)修改IP jmp 某一合法寄存器
检测点2.3
下面的3条指令执行后,cpu几次修改IP?都是在什么时候?最后IP中的值是多少?
mov ax,bx
sub ax,ax
jmp ax
答:一共修改四次
第一次:读取mov ax,bx之后
第二次:读取sub ax,ax之后
第三次:读取jmp ax之后
第四次:执行jmp ax修改IP
最后IP的值为0000H,因为最后ax中的值为0000H,所以IP中的值也为0000H
注:sub为减法指令
实验1 查看CPU和内存,用机器指令和汇编指令编程
1.debug的使用(一)
·R命令查看、改变CPU寄存器的内容
·D命令查看内存中的内容
·E命令改写内存中的内容
·U命令将机器指令翻译为汇编指令
·T命令执行一条机器指令
·A命令用汇编指令的格式在内存中写入一条机器指令
各个命令的用法
(1) R 寄存器修改寄存器的值
(2) R查看所有寄存器的值
(3) D 段地址:偏移地址列出从指定内存单元开始的128个内存单元的内容
(4) D列出预设地址处的内容(128个内存单元)
(5) D 段地址:起始偏移地址 结尾偏移地址指定查看范围
(6) E 起始地址 数据 数据 数据…….改写连续的内存单元
(7) E 段地址:偏移地址改写指定位置的内存单元
(8) U 段地址:偏移地址将指定位置的机器码翻译为汇编指令
(9) T执行CS:IP处的指令
(10) A 段地址:偏移地址以汇编指令的形式写入指令。
(11) Q退出DEBUG
2实验任务
(1)使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化。
机器码 汇编指令 寄存器
b8 20 4e mov ax,4E20H ax=4E20H
05 16 14 add ax,1416H ax=6236H
bb 00 20 mov BX,2000H bx=2000H
01 d8 add ax,bx ax=8236H
89 c3 mov bx,ax bx=8236H
01 d8 add ax,bx ax=046CH
b8 1a 00 mov ax,001AH ax=001AH
bb 26 00 mov bx,0026H bx=0026H
00 d8 add al,bl ax=0040H
00 dc add ah,bl ax=2640H
00 c7 add bh,al bx=4026H
b4 00 mov ah,0 ax=0040H
00 d8 add al,bl ax=0066H
04 9c add al,9CH ax=0002H
(2)将下面的3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。
mov ax,1
add ax,ax
jmp 2000:0003
(3) 查看内存中的内容
PC主板上的ROM中有个一出产日期,在内存FFF00H-FFFFFH的某几个单元中,请找到这个出产日期并试图改变它。
(4) 向内存从B8100H开始的单元中填写数据,如
-e B810:0000 01 01 02 02 03 03 04 04
填写不同的数据,观察现象,改变填写的地址,观察现象
现象:屏幕上出现文字,因为这是在显存中写入数据
