8086 汇编#2

第二章 寄存器 – 汇编语言提纲

第二章 寄存器

第二章 寄存器

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
填写不同的数据,观察现象,改变填写的地址,观察现象

现象:屏幕上出现文字,因为这是在显存中写入数据

发表评论

滚动至顶部