80X86微机原理及接口技术实验教程12.docx
《80X86微机原理及接口技术实验教程12.docx》由会员分享,可在线阅读,更多相关《80X86微机原理及接口技术实验教程12.docx(70页珍藏版)》请在冰豆网上搜索。
80X86微机原理及接口技术实验教程12
80X86微机原理及接口技术
实验教程
合肥工业大学电气与自动化专业实验中心
第1章16位微机原理及其程序设计实验
本章主要介绍汇编语言程序设计,通过实验来学习80X86的指令系统、寻址方式以及程序的设计方法,同时掌握联机软件的使用。
1.1系统认识实验
1.1.1实验目的
掌握TD系列微机原理及接口技术教学实验系统的操作,熟悉Wmd86联机集成开发调试软件的操作环境。
1.1.2实验设备
PC机一台,TD-PITE实验装置一套。
1.1.3实验内容
编写实验程序,将00H~0FH共16个数写入内存3000H开始的连续16个存储单元中。
1.1.4实验步骤
1.运行Wmd86软件,进入Wmd86集成开发环境。
2.根据程序设计使用语言的不同,通过在“设置”下拉列表来选择需要使用的语言和寄存器类型,这里我们设置成“汇编语言”和“16位寄存器”,如图1.1、图1.2所示。
设置选择后,下次再启动软件,语言环境保持这次的修改不变。
本章选择16位寄存器。
图1.1语言环境设置界面
图1.2寄存器设置界面
3.语言和寄存器选择后,点击新建或按Ctrl+N组合键来新建一个文档,如图1.3所示。
默认文件名为Wmd861。
图1.3新建文件界面
4.编写实验程序,如图1.4所示,并保存,此时系统会提示输入新的文件名,输完后点击保存。
图1.4程序编辑界面
5.点击
,编译文件,若程序编译无误,则可以继续点击
进行链接,链接无误后方可以加载程序。
编译、链接后输出如图1.5所示的输出信息。
图1.5编译输出信息界面
6.连接PC与实验系统的通讯电缆,打开实验系统电源。
7.编译、链接都正确并且上下位机通讯成功后,就可以下载程序,联机调试了。
可以通过端口列表中的“端口测试”来检查通讯是否正常。
点击
下载程序。
为编译、链接、下载组合按钮,通过该按钮可以将编译、链接、下载一次完成。
下载成功后,在输出区的结果窗中会显示“加载成功!
”,表示程序已正确下载。
起始运行语句下会有一条绿色的背景。
如图1.6所示。
图1.6加载成功显示界面
8.将输出区切换到调试窗口,使用D0000:
3000命令查看内存3000H起始地址的数据,如图1.7所示。
存储器在初始状态时,默认数据为CC。
图1.7内存地址单元数据显示
9.点击按钮
运行程序,待程序运行停止后,通过D0000:
3000命令来观察程序运行结果。
如图1.8所示。
图1.8运行程序后数据变化显示
10.也可以通过设置断点,断点显示如图1.9所示,然后运行程序,当遇到断点时程序会停下来,然后观察数据。
可以使用E0000:
3000来改变该地址单元的数据,如图1.10所示,输入11后,按“空格”键,可以接着输入第二个数,如22,结束输入按“回车”键。
图1.9断点设置显示图1.10修改内存单元数据显示界面
实验例程文件名为Wmd861.asm。
1.1.5操作练习
编写程序,将内存3500H单元开始的8个数据复制到3600H单元开始的数据区中。
通过调试验证程序功能,使用E命令修改3500H单元开始的数据,运行程序后使用D命令查看3600H单元开始的数据。
SSTACKSEGMENTSTACK
DW32DUP(?
)
SSTACKENDS
CODESEGMENT
ASSUMECS:
CODE,SS:
SSTACK
START:
PUSHDS
XORAX,AX
MOVDS,AX
MOVSI,3500H
MOVDI,3600H
MOVCX,8
AA1:
MOVAL,[SI]
MOV[DI],AL
INCSI
INCDI
LOOPAA1
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
1.2数制转换实验
1.2.1实验目的
1.掌握不同进制数及编码相互转换的程序设计方法,加深对数制转换的理解。
2.熟悉程序调试的方法。
1.2.2实验设备
PC机一台,TD-PITE实验装置一套。
1.2.3实验内容及步骤
计算机输入设备输入的信息一般是由ASCII码或BCD码表示的数据或字符,CPU一般均用二进制数进行计算或其它信息处理,处理结果的输出又必须依照外设的要求变为ASCII码、BCD码或七段显示码等。
因此,在应用软件中,各类数制的转换是必不可少的。
计算机与外设间的数制转换关系如图1.11所示,数制对应关系如表1.1所示。
图1.11数制转换关系
1.将ASCII码表示的十进制数转换为二进制数
十进制表示为:
(1)
Di代表十进制数0,1,2,…,9;
上式转换为:
(2)
由式
(2)可归纳十进制数转换为二进制数的方法:
从十进制数的最高位Dn开始作乘10加次位的操作,依次类推,则可求出二进制数的结果。
表1.1数制对应关系表
十六进制
BCD码
二进制
机器码
ASCII码
七段码
共阳
共阴
0
0000
0000
30H
40H
3FH
1
0001
0001
31H
79H
06H
2
0010
0010
32H
24H
5BH
3
0011
0011
33H
30H
4FH
4
0100
0100
34H
19H
66H
5
0101
0101
35H
12H
6DH
6
0110
0110
36H
02H
7DH
7
0111
0111
37H
78H
07H
8
1000
1000
38H
00H
7FH
9
1001
1001
39H
18H
67H
A
1010
41H
08H
77H
B
1011
42H
03H
7CH
C
1100
43H
46H
39H
D
1101
44H
21H
5EH
E
1110
45H
06H
79H
F
1111
46H
0EH
71H
程序流程图如图1.12所示。
实验参考程序如下。
实验程序清单(例程文件名:
A2-1.ASM)
SSTACKSEGMENTSTACK
DW64DUP(?
)
SSTACKENDS
DATASEGMENT
SADDDB30H,30H,32H,35H,36H;十进制数:
00256
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,OFFSETSADD
MOVSI,AX
MOVBX,000AH
MOVCX,0004H
MOVAH,00H
MOVAL,[SI]
SUBAL,30H
A1:
IMULBX
MOVDX,[SI+01]
ANDDX,00FFH
ADCAX,DX
SBBAX,30H
INCSI
LOOPA1
A2:
JMPA2
CODEENDS
ENDSTART
实验步骤
(1)绘制程序流程图,编写实验程序,经编译、链接无误后装入系统。
(2)待转换数据存放于数据段,根据自己要求输入,默认为30H,30H,32H,35H,36H。
(3)运行程序,然后停止程序。
(4)查看AX寄存器,即为转换结果,应为:
0100。
(5)反复试几组数据,验证程序的正确性。
2.将十进制数的ASCII码转换为BCD码
从键盘输入五位十进制数的ASCII码,存放于3500H起始的内存单元中,将其转换为BCD码后,再按位分别存入350AH起始的内存单元内。
若输入的不是十进制的ASCII码,则对应存放结果的单元内容为“FF”。
由表1.1可知,一字节ASCII码取其低四位即变为BCD码。
实验程序清单(例程文件名:
A2-2.ASM)
SSTACKSEGMENTSTACK
DW64DUP(?
)
SSTACKENDS图1.12转换程序流程图
CODESEGMENT
ASSUMECS:
CODE
START:
MOVCX,0005H;转换位数
MOVDI,3500H;ASCII码首地址
A1:
MOVBL,0FFH;将错误标志存入BL
MOVAL,[DI]
CMPAL,3AH
JNBA2;不低于3AH则转A2
SUBAL,30H
JBA2;低于30H则转A2
MOVBL,AL
A2:
MOVAL,BL;结果或错误标志送入AL
MOV[DI+0AH],AL;结果存入目标地址
INCDI
LOOPA1
MOVAX,4C00H
INT21H;程序终止
CODEENDS
ENDSTART
实验步骤
(1)自己绘制程序流程图,然后编写程序,编译、链接无误后装入系统。
(2)在3500H~3504H单元中存放五位十进制数的ASCII码,即:
键入E3500后,输入31,32,33,34,35。
(3)运行程序,待程序运行停止。
(4)在调试窗口键入D350A,显示运行结果,应为:
0000:
350A0102030405CC…
(5)反复测试几组数据,验证程序功能。
3.将十六位二进制数转换为ASCII码表示的十进制数
十六位二进制数的值域为0~65535,最大可转换为五位十进制数。
五位十进制数可表示为:
Di:
表示十进制数0~9
将十六位二进制数转换为五位ASCII码表示的十进制数,就是求D1~D4,并将它们转换为ASCII码。
自行绘制程序流程图,编写程序可参考例程。
例程中源数存放于3500H、3501H中,转换结果存放于3510H~3514H单元中。
实验程序清单(例程文件名:
A2-3.ASM)
SSTACKSEGMENTSTACK
DW64DUP(?
)
SSTACKENDS
CODESEGMENT
ASSUMECS:
CODE
START:
MOVSI,3500H;源数据地址
MOVDX,[SI]
MOVSI,3515H;目标数据地址
A1:
DECSI
MOVAX,DX
MOVDX,0000H
MOVCX,000AH;除数10
DIVCX;得商送AX,得余数送DX
XCHGAX,DX
ADDAL,30H;得Di的ASCII码
MOV[SI],AL;存入目标地址
CMPDX,0000H
JNEA1;判断转换结束否,未结束则转A1
A2:
CMPSI,3510H;与目标地址得首地址比较
JZA3;等于首地址则转A3,否则将剩余地址中填30H
DECSI
MOVAL,30H
MOV[SI],AL
JMPA2
A3:
MOVAX,4C00H
INT21H;程序终止
CODEENDS
ENDSTART
实验步骤
(1)编写程序,经编译、链接无误后,装入系统。
(2)在3500H、3501H中存入0C00。
(3)运行程序,待程序运行停止。
(4)检查运行结果,键入D3510,结果应为:
3030303132。
(5)可反复测试几组数据,验证程序的正确性。
4.十六进制数转换为ASCII码
由表1.1中十六进制数与ASCII码的对应关系可知:
将十六进制数0H~09H加上30H后得到相应的ASCII码,AH~FH加上37H可得到相应的ASCII码。
将四位十六进制数存放于起始地址为3500H的内存单元中,把它们转换为ASCII码后存入起始地址为350AH的内存单元中。
自行绘制流程图。
实验程序清单(例程文件名为A2-4.ASM)
SSTACKSEGMENTSTACK
DW64DUP(?
)
SSTACKENDS
CODESEGMENT
ASSUMECS:
CODE
START:
MOVCX,0004H
MOVDI,3500H;十六进制数源地址
MOVDX,[DI]
A1:
MOVAX,DX
ANDAX,000FH;取低4位
CMPAL,0AH
JBA2;小于0AH则转A2
ADDAL,07H;在A~FH之间,需多加上7H
A2:
ADDAL,30H;转换为相应ASCII码
MOV[DI+0DH],AL;结果存入目标地址
DECDI
PUSHCX
MOVCL,04H
SHRDX,CL;将十六进制数右移4位
POPCX
LOOPA1
MOVAX,4C00H
INT21H;程序终止
CODEENDS
ENDSTART
实验步骤
(1)编写程序,经编译、链接无误后装入系统。
(2)在3500H、3501H中存入四位十六进制数203B,即键入E3500,然后输入3B20。
(3)先运行程序,待程序运行停止。
(4)键入D350A,显示结果为:
0000:
350A32303342CC…。
(5)反复输入几组数据,验证程序功能。
5.BCD码转换为二进制数
将四个二位十进制数的BCD码存放于3500H起始的内存单元中,将转换的二进制数存入3510H起始的内存单元中,自行绘制流程图并编写程序。
实验程序清单(例程文件名为:
A2-5.ASM)
SSTACKSEGMENTSTACK
DW64DUP(?
)
SSTACKENDS
CODESEGMENT
ASSUMECS:
CODE
START:
XORAX,AX
MOVCX,0004H
MOVSI,3500H
MOVDI,3510H
A1:
MOVAL,[SI]
ADDAL,AL
MOVBL,AL
ADDAL,AL
ADDAL,AL
ADDAL,BL
INCSI
ADDAL,[SI]
MOV[DI],AL
INCSI
INCDI
LOOPA1
MOVAX,4C00H
INT21H;程序终止
CODEENDS
ENDSTART
实验步骤
(1)编写程序,经编译、链接无误后装入系统。
(2)将四个二位十进制数的BCD码存入3500H~3507H中,即:
先键入E3500,然后输入0102030405060708。
(3)先运行程序,待程序运行停止。
(4)键入D3510显示转换结果,应为:
0C22384E。
(5)反复输入几组数据,验证程序功能。
1.2.4思考题
1.实验内容1中将一个五位十进制数转换为二进制数(十六位)时,这个十进制数最小可为多少,最大可为多少?
为什么?
最小为0,最大为65535,因为16位二进制数可表示的最小数值为0最大数值为65535.
2.将一个十六位二进制数转换为ASCII码十进制数时,如何确定Di的值?
先将二进制数除以10,得到的余数为十进制数的最低位即D0,判断其是否为0-9的数,若是,则加上30H为其ASCII码,若结果为A-F则加上37H为其ASCII码值,再将原数右移四位,继续除以10,得到的余数为D1,再重复进行上述操作,可得到各位Di。
3.在十六进制转换为ASCII码时,存转换结果后,为什么要把DX向右移四次?
因为一个ASCII码可表示为4位二进制数,存转换结果后,要转换下一个ASCII码需要右移四次得到新的低四位的二进制数。
4.自编ASCII码转换十六进制、二进制转换BCD码的程序,并调试运行。
ASCII转换十六进制
程序代码
CODESEGMENT
ASSUMECS:
CODE
START:
MOVAX,0
MOVDS,AX
MOVAL,‘0’
CMPAL,39H
JBEA1
CMPAL,41H
JAEA2
A1:
SUBAL,30H
JMPNEXT
A2:
SUBAL,37H
NEXT:
MOVDL,AL
MOVAH,4CH;结束程序
INT21H;返回DOS
CODEENDS
ENDSTART
可见AL为字符0时DL为00H
AL为字符1时DL为01H
二进制转换BCD
SSTACKSEGMENTSTACK
DW64DUP(?
)
SSTACKENDS
CODE SEGMENT
ASSUME CS:
CODE
START:
MOVAX,0
MOVDS,AX
MOVDI,3510
MOV AX,0010H
MOV BX,10000
DIV BX
MOV [DI],AL
MOV AX,DX
MOVDX,0;
MOV BX,1000
DIV BX
MOV [DI+1],AL
MOV AX,DX
MOV DX,0
MOV BX,100
DIV BX
MOV [DI+2],AL
MOV AX,DX
MOV DX,0
MOV BX,10
DIV BX
MOV [DI+3],AL
MOV [DI+4],DL
MOV AH,4CH
INT 21H
CODE ENDS
END START
可见AX输入为0010H即十进制的16时,从0000H:
3510H内存单元开始存放的内容是00H,00H,
00H,01H,06H,即16的BCD码。
(此处用八位代替原来的4四位)
1.3运算类编程实验
1.3.1实验目的
1.掌握使用运算类指令编程及调试方法。
2.掌握运算类指令对各状态标志位的影响及其测试方法。
3.学习使用软件监视变量的方法。
1.3.2实验设备
PC机一台,TD-PITE实验装置一套。
1.3.3实验内容及步骤
80X86指令系统提供了实现加、减、乘、除运算的基本指令,可对表1.2所示的数据类型进行算术运算。
表1.2数据类型算术运算表
数制
二进制
BCD码
带符号
无符号
组合
非组合
运算符
+、-、×、÷
+、-
+、-、×、÷
操作数
字节、字、多精度
字节(二位数字)
字节(一位数字)
1.二进制双精度加法运算
计算X+Y=Z,将结果Z存入某存储单元。
实验程序参考如下。
本实验是双精度(2个16位,即32位)加法运算,编程时可利用累加器AX,先求低16位的和,并将运算结果存入低地址存储单元,然后求高16位的和,将结果存入高地址存储单元中。
由于低16运算后可能向高位产生进位,因此高16位运算时使用ADC指令,这样在低16位相加运算有进位时,高位相加会加上CF中的1。
实验程序清单(例程文件名为:
A3-1.ASM)
SSTACKSEGMENTSTACK
DW64DUP(?
)
SSTACKENDS
PUBLICXH,XL,YH,YL,ZH,ZL;设置全局变量
DATASEGMENT
XLDW?
;X低位
XHDW?
;X高位
YLDW?
;Y低位
YHDW?
;Y高位
ZLDW?
;Z低位
ZHDW?
;Z高位
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,XL
ADDAX,YL;X低位加Y低位
MOVZL,AX;低位和存到Z的低位
MOVAX,XH
ADCAX,YH;高位带进位加
MOVZH,AX;存高位结果
JMPSTART;在此行设置断点,以观察变量值
CODEENDS
ENDSTART
实验步骤
(1)编写程序,经编译、链接无误后装入系统。
(2)程序装载完成后,点击‘变量区’标签将观察窗切换到变量监视窗口。
(3)点击
,将变量XH,XL,YH,YL,ZH,ZL添加到变量监视窗中,然后修改XH,XL,YH,YL的值,如图2.13所示,修改XH为0015,XL为65A0,YH为0021,YL为B79E。
(4)在JMPSTART语句行设置断点,然后运行程序。
(5)当程序遇到断点后停止运行,查看变量监视窗口,计算结果ZH为0037,ZL为1D3E。
(6)修改XH,XL,YH和YL的值,再次运行程序,观察实验结果,反复测试几组数据,验证程序的功能。
思考题:
1.求累加和程序设计,在偏移地址为1000H开始依顺序填入16个字(16个16位数),利用程序求和,存放在偏移地址2000H;
SSTACKSEGMENTSTACK
DW64DUP(?
)
SSTACKENDS
CODE SEGMENT
ASSUME CS:
CODE
START:
MOVAX,0
MOVDS,AX
MOVDI,1000H
MOVCX,16
MOVDX,0
A1:
ADDAX,[DI]
ADCDX,0
INCDI
INCDI
LOOPA1
MOVDI,2000H
MOV[DI],AX
INCDI
INCDI
MOV[DI],DX
MOVAH,4CH;结束程序
INT21H;返回DOS
CODEENDS
ENDSTART
在0000H:
1000H开始的内存中输入16个相同的字0001H,结果如截图
2.多字节加法程序设计,参考原程序,编写个两个64位数的减法程序,结果保存到具体内存单元,调试并记录。
SSTACKSEGMENTSTACK