2024年5月1日发(作者:)
一、系统认识实验
1.1 实验目的
掌握QASM轻松汇编(TD系列微机原理及接口技术教学实验系统)的操作,熟悉QASM(Wmd86
联机集成开发调试软件)的操作环境。学习和掌握程序编写,汇编,调试的方法和技术。
1.2 实验设备
PC机一台,(TD-PITE实验装置或TD-PITC实验装置一套)。
1.3 实验内容
编写实验程序,将00H~0FH共16个数写入内存03000H开始的连续16个存储单元中。
1.4 实验步骤
1. 进入QASM编程环境:将TDASM和ASMPRO文件夹复制到D盘根目录上,运行TDASM下
的QASM,进入集成开发环境。
2.输入汇编源程序:编写输入实验程序,如图所示,并保存为A1,此时系统会提示输入新的文件名,
输完后点击保存。可以用打开文件方式将以前保存的源程序调入。
程序编辑界面
3. 程序的汇编与连接:点击
误后方运行调试程序。
,编译文件,若程序编译无误,则可以继续点击进行链接,链接无
编译输出信息界面
4. 观察程序及变量分配:点击“交叉文件”,观察源程序代码与机器代码与存储形式。
点击“汇编程序”返回汇编程序窗口。
操作练习:1、对上述程序进行观察。看汇编源程序的指令与机器码指令的对应关系及程序存放形式。
2、打开程序EX1,观察变量定义及存放关系。
3、打开EX3—2,观察变量定义及内存分配。
5.集成调试环境的使用:
单步执行:点击“调试”菜单下的“单步”,可以一条一条的执行指令。
查看修改寄存器:在调试过程中,可能通过调试窗口的“调试”选单,观察和修改CPU中寄存器的
内容。
查看变量和存储单元内容:在调试过程中,可能通过调试窗口的“查看”选单,可以添加要查看的存
储单元或者变量的的内容。
断点设置:在程序的对应指令行点击行号,可以设置程序断点(出现红色园点)。或者取消断点。
连续运行:点击调试菜单下的“GO”,或让程序连续运行到断点处停止。
操作练习: 1、打开程序EX1,单步运行程序,观察寄存器及存储单元变化。并记录。
3、打开EX3—2,观察变量定义及内存分配。单步运行程序,观察寄存器及存储单元
变化。并记录。
6.TRUBODEBUGGER的使用:(详细说明见TRUBODEBUGGER一览表)
进入TD:汇编连接完成后,点击“调试”菜单下的“TD。。。”可进入TRUBODEBUGGER调试环
境。
单步执行:点击“STEP”,可以一条一条的执行指令。
查看修改寄存器:点击“VIEW”菜单下的“REGISTER”选单,可以观察和修改CPU中寄存器的
内容。
查看和修改变量单元内容:点击“VIEW”菜单下的“VARIABLE”选单,可以观察和修改变量单元
的内容。
查看和修改存储单元内容:点击“VIEW”菜单下的“DUMP”选单,可以观察和修改存储单元的内
容。
断点设置:在程序的对应指令行点击,再点击“BKPT”,可以在该得设置断点。
连续运行:点击 “RUN”,让程序连续运行到断点处停止。
操作练习: 1、打开程序A1,单步和设置断点运行程序,观察寄存器及存储单元变化。
程序观察程序运行前后 0000:3000开始的十六个字节单元的数据。
2、打开EX1,单步和设置断点运行程序,输入不同数,运行后检查变量X和XXX的
值,并记录。
3、编写程序,将内存0000:3500H单元开始的8个数据复制到0000:3600H单元开始
的数据区中。通过调试验证程序功能。使用TD调试程序,先将0000:3500H单元写入8个数,然后运
行程序,观察程序是否将数据复制到0000:3600H单元中。
二、数制转换实验
计算机与外设间的数制转换关系如图2-1所示,数制对应关系如表2-1所示。
键 盘
光 电 机
拨码开关
数据开关
ASCII码
ASCII码
BCD码
二进制
二进制
ASCII码
ASCII码
BCD码
二进制
CRT显示
打 印 机
多段显示
位 显 示
主
机
图2-1 数制转换关系
1.操作练习:
1、打开程序A1,单步和设置断点运行程序,观察寄存器及存储单元变化。
程序观察程序运行前后 0000:3000开始的十六个字节单元的数据。
2、打开EX1,单步和设置断点运行程序,输入不同数,运行后检查变量X和XXX的
值,并记录。
3、编写程序,将内存0000:3500H单元开始的8个数据复制到0000:3600H单元开始
的数据区中。通过调试验证程序功能。使用TD调试程序,先将0000:3500H单元写入8个数,然后运
行程序,观察程序是否将数据复制到0000:3600H单元中。
2. 将ASCII码表示的十进制数转换为二进制数
十进制表示为:
D
n
10D
n1
10
nn1
n
D
0
10
0
D
i0
i
10
i
(1)
D
i
代表十进制数0,1,2,…,9;
上式转换为:
D
i0
n
i
10
i
(((D
n
10D
n1
)10D
n2
)10D
1
)10D
0
(2)
由式(2)可归纳十进制数转换为二进制数的方法:从十进制数的最高位D
n
开始作乘10加次位的操
作,依次类推,则可求出二进制数的结果。
表2-1 数制对应关系表
十六进制
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
程序流程图如图2-2所示。实验参考程序如下。
实验程序清单(例程文件名:)
SSTACK
SSTACK
DATA
SADD
DATA
CODE
START:
A1:
SEGMENT STACK
DW 64 DUP(?)
ENDS
SEGMENT
DB 30H,30H,32H,35H,36H
ENDS
SEGMENT
ASSUME CS:CODE, DS:DATA
MOV AX, DATA
MOV DS, AX
MOV AX, OFFSET SADD
MOV SI, AX
MOV BX, 000AH
MOV CX, 0004H
MOV AH, 00H
MOV AL, [SI]
SUB AL, 30H
IMUL BX
MOV DX, [SI+01]
程序开始
初始化转换首地址
转换次数→CX
BCD码
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
二进制
机器码
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
ASCII码
30H
31H
32H
33H
34H
35H
36H
37H
38H
39H
41H
42H
43H
44H
45H
46H
七段码
共阳
40H
79H
24H
30H
19H
12H
02H
78H
00H
18H
08H
03H
46H
21H
06H
0EH
共阴
3FH
06H
5BH
4FH
66H
6DH
7DH
07H
7FH
67H
77H
7CH
39H
5EH
79H
71H
;十进制数:00256
取第一位ASCII码
减去30H
乘10
加下一位ASCII码减30H
N
转换完否?
Y
程序结束
A2:
CODE
AND DX, 00FFH
ADC AX, DX
SUB AX, 30H
INC SI
LOOP A1
JMP A2
ENDS
END START
图2-2 转换程序流程图
实验步骤
(1)绘制程序流程图,编写实验程序,经编译、链接无误后装入系统。
(2)待转换数据存放于数据段,根据自己要求输入,默认为30H,30H,32H,35H,36H。
(3)在A2处设置断点,然后运行程序。
(4)到断点后查看AX寄存器,即为转换结果,应为:0100 。
(5)数据区的数据修改为自己学号的后四位数据(如:03526),按照上面步骤运行程序,记录结果。
(6)修改数据区数据,按照上面步骤运行程序,验证程序的正确性,记录结果。
4. 将十进制数的ASCII码转换为BCD码
从键盘输入五位十进制数的ASCII码,存放于3500H起始的内存单元中,将其转换为BCD码后,
再按位分别存入350AH起始的内存单元内。若输入的不是十进制的ASCII码,则对应存放结果的单元内
容为“FF”。由表2-1可知,一字节ASCII码取其低四位即变为BCD码。
实验程序清单(例程文件名:)
SSTACK
SSTACK
CODE
START:
A1:
A2:
CODE
SEGMENT STACK
DW 64 DUP(?)
ENDS
SEGMENT
ASSUME CS:CODE
XOR AX,AX
MOV DS,AX
MOV CX, 0005H
MOV DI, 3500H
MOV BL, 0FFH
MOV AL, [DI]
CMP AL, 3AH
JNB A2
SUB AL, 30H
JB A2
MOV BL, AL
MOV AL, BL
MOV [DI+0AH],AL
INC DI
LOOP A1
MOV AX,4C00H
INT 21H
ENDS
END START
;转换位数
;ASCII码首地址
;将错误标志存入BL
;不低于3AH则转A2
;低于30H则转A2
;结果或错误标志送入AL
;结果存入目标地址
;程序终止
实验步骤
(1)自己绘制程序流程图,然后编写程序,编译、链接无误后装入系统。
(2)在0000:3500H~0000:3504H单元中存放五位十进制数的ASCII码,即: 31,32,33,
34,35。
(3)在
MOV AX,4C00H指令处设置断点,
运行程序到断点。
(4)0000:350AH单元,显示运行结果,应为:
0000:350A 01 02 03 04 05 CC …
(5)反复测试几组数据,验证程序功能。
5. 将十六位二进制数转换为ASCII码表示的十进制数
十六位二进制数的值域为0~65535,最大可转换为五位十进制数。
五位十进制数可表示为:
ND
4
10
4
D
3
10
3
D
2
10
2
D
1
10D
0
D
i
:表示十进制数0~9
将十六位二进制数转换为五位ASCII码表示的十进制数,就是求D1~D4,并将它们转换为ASCII
码。自行绘制程序流程图,编写程序可参考例程。例程中源数存放于3500H、3501H中,转换结果存放
于3510H~3514H单元中。
实验程序清单(例程文件名:)
SSTACK
SSTACK
CODE
START:
A1:
A2:
A3:
CODE
SEGMENT STACK
DW 64 DUP(?)
ENDS
SEGMENT
ASSUME CS:CODE
MOV SI,3500H
MOV DX,[SI]
MOV SI,3515H
DEC SI
MOV AX,DX
MOV DX,0000H
MOV CX,000AH
DIV CX
XCHG AX,DX
ADD AL,30H
MOV [SI],AL
CMP DX,0000H
JNE A1
CMP SI,3510H
JZ A3
DEC SI
MOV AL,30H
MOV [SI],AL
JMP A2
MOV AX,4C00H
INT 21H
ENDS
END START
;源数据地址
;目标数据地址
;除数10
;得商送AX, 得余数送DX
;得Di的ASCII码
;存入目标地址
;判断转换结束否,未结束则转A1
;与目标地址得首地址比较
;等于首地址则转A3,否则将剩余地址中填30H
;程序终止
实验步骤
(1)编写程序,经编译、链接无误后,装入系统。
(2)在3500H、3501H中存入0C 00。
(3)运行程序,待程序运行停止。
(4)检查运行结果,键入D3510,结果应为:30 30 30 31 32。
(5)可反复测试几组数据,验证程序的正确性。
6. 十六进制数转换为ASCII码
由表2.1中十六进制数与ASCII码的对应关系可知:将十六进制数0H~09H加上30H后得到相应
的ASCII码,AH~FH加上37H可得到相应的ASCII码。将四位十六进制数存放于起始地址为3500H
的内存单元中,把它们转换为ASCII码后存入起始地址为350AH的内存单元中。自行绘制流程图。
实验程序清单(例程文件名为)
SSTACK SEGMENT STACK
SSTACK
CODE
START:
A1:
A2:
CODE
DW 64 DUP(?)
ENDS
SEGMENT
ASSUME CS:CODE
MOV CX,0004H
MOV DI,3500H
MOV DX,[DI]
MOV AX,DX
AND AX,000FH
CMP AL,0AH
JB A2
ADD AL,07H
ADD AL,30H
MOV [DI+0DH],AL
DEC DI
PUSH CX
MOV CL,04H
SHR DX,CL
POP CX
LOOP A1
MOV AX,4C00H
INT 21H
ENDS
END START
;十六进制数源地址
;取低4位
;小于0AH则转A2
;在A~FH之间,需多加上7H
;转换为相应ASCII码
;结果存入目标地址
;将十六进制数右移4位
;程序终止
实验步骤
(1)编写程序,经编译、链接无误后装入系统。
(2)在3500H、3501H中存入四位十六进制数203B,即键入E3500,然后输入3B 20。
(3)先运行程序,待程序运行停止。
(4)键入D350A,显示结果为:0000:350A 32 30 33 42 CC …。
(5)反复输入几组数据,验证程序功能。
7. BCD码转换为二进制数
将四个二位十进制数的BCD码存放于3500H起始的内存单元中,将转换的二进制数存入3510H起
始的内存单元中,自行绘制流程图并编写程序。
实验程序清单(例程文件名为:)
SSTACK
SSTACK
CODE
START:
A1:
SEGMENT STACK
DW 64 DUP(?)
ENDS
SEGMENT
ASSUME CS:CODE
XOR AX, AX
MOV CX, 0004H
MOV SI, 3500H
MOV DI, 3510H
MOV AL, [SI]
ADD AL, AL
MOV BL, AL
ADD AL, AL
ADD AL, AL
ADD AL, BL
INC SI
ADD AL, [SI]
MOV [DI], AL
INC SI
INC DI
CODE
LOOP A1
MOV AX,4C00H
INT 21H
ENDS
END START
;程序终止
实验步骤
(1)编写程序,经编译、链接无误后装入系统。
(2)将四个二位十进制数的BCD码存入3500H~3507H中,即:
先键入E3500,然后输入01 02 03 04 05 06 07 08。
(3)先运行程序,待程序运行停止。
(4)键入D3510显示转换结果,应为:0C 22 38 4E。
(5)反复输入几组数据,验证程序功能。
8.提高练习
将上述程序数据部分全部改为变量形式,然后运行,通过变量查看运行结果。
(例如:将十进制数的ASCII码转换为BCD码
实验程序清单(例程文件名:)
SSTACK
DATA
ASCN
BCDN
DATA
CODE
START:
A1:
A2:
CODE
ENDS
SEGMENT
DB 31H,32H,33H,34H,35H
DB 5 DUP(?)
ENDS
SEGMENT
ASSUME CS:CODE ,DS:DATA
MOV AX,DATA
MOV DS,AX
MOV CX, 0005H
MOV DI, OFFSET ASCN
MOV BL, 0FFH
MOV AL, [DI]
CMP AL, 3AH
JNB A2
SUB AL, 30H
JB A2
MOV BL, AL
MOV AL, BL
MOV [DI+BCDN],AL
INC DI
LOOP A1
MOV AX,4C00H
INT 21H
ENDS
END START
;转换位数
;ASCII码首地址
;将错误标志存入BL
;不低于3AH则转A2
;低于30H则转A2
;结果或错误标志送入AL
;结果存入目标地址
;程序终止
)
三、分支程序设计实验
设计一数据块间的搬移程序。设计思想:程序要求把内存中一数据区(称为源数据块)传送到另一存
储区(成为目的数据块)。源数据块和目的数据块在存储中可能有三种情况,如图2.14所示。
0H
源
数
据
块
0H
0H
目
的
数
据
块
源数据块
目的数据块
目
的
数
据
块
源
数
据
块
FFFFFH
FFFFFH
FFFFFH
(a) (b) (c)
图4-1 源数据块与目的数据块在存储中的位置情况
对于两个数据块分离的情况,如图4-1(a),数据的传送从数据块的首地址开始,或从数据块的末地
址开始均可。但是对于有重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭到破坏,可有如下
结论:
当源数据块首地址<目的块首地址时,从数据块末地址开始传送数据,如图4-1(b)所示。
当源数据块首地址>目的块首地址时,从数据块首地址开始传送数据,如图4-1(c)所示。
实验程序流程图如图4-2所示。
开 始
源数据块首地址→SI
源数据块首地址→SI
搬移字节数→CX
>
SI←[SI]+[CX]-1
DI←[DI]+[CX]-1
DI←[(SI)]
SI←[SI]-1
DI←[DI]-1
CX←[CX]-1
N
[CX]=0?
Y
结 束
实验程序清单(例程文件名为:)
SSTACK
SSTACK
CODE
SEGMENT STACK
DW 64 DUP(?)
ENDS
SEGMENT
>
[SI]>[DI]?
DI←[(SI)]
SI←[SI]+1
DI←[DI]+1
CX←[CX]-1
[CX]=0?
Y
N
图4-2 程序流程图
START:
A1:
A2:
A3:
CODE
ASSUME CS:CODE
MOV CX, 0010H
MOV SI, 3100H
MOV DI, 3200H
CMP SI, DI
JA A2
ADD SI, CX
ADD DI, CX
DEC SI
DEC DI
MOV AL, [SI]
MOV [DI], AL
DEC SI
DEC DI
DEC CX
JNE A1
JMP A3
MOV AL, [SI]
MOV [DI], AL
INC SI
INC DI
DEC CX
JNE A2
MOV AX,4C00H
INT 21H
ENDS
END START
;程序终止
实验步骤
1. 按流程图编写实验程序,经编译、链接无误后装入系统。
2. 用E命令在以SI为起始地址的单元中填入16个数。
3. 运行程序,待程序运行停止。
4. 通过D命令查看DI为起始地址的单元中的数据是否与SI单元中数据相同。
5. 通过改变SI、DI的值,观察在三种不同的数据块情况下程序的运行情况,并验证程序的功能。
四、循环程序设计实验
实验内容及步骤
1. 计算S=1+2×3+3×4+4×5+…+N(N+1),直到N(N+1)项大于200为止。
编写实验程序,计算上式的结果,参考流程图如图5-1所示。
实验程序清单(例程文件名为:)
SSTACK SEGMENT STACK
DW 64 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE
START: MOV DX,0001H
MOV BL,02H
A1: MOV AL,BL
INC BL
MUL BL
ADD DX,AX ;结果存于DX中
CMP AX,00C8H ;判断N(N+1)与200的大小
JNA A1
MOV AX,4C00H
INT 21H ;程序终止
CODE ENDS
END START
实验步骤
(1)编写实验程序,编译、链接无误后装入系统。
(2)运行程序,待程序运行停止。
(3)运算结果存储在寄存器DX中,查看结果是否正
(4)可以改变N(N+1)的条件来验证程序功能是否
但要注意,结果若大于0FFFFH将产生数据溢出。
2. 求某数据区内负数的个数
设数据区的第一单元存放区内单元数据的个数,从第二
开始存放数据,在区内最后一个单元存放结果。为统计数据
负数的个数,需要逐个判断区内的每一个数据,然后将所有
中凡是符号位为1的数据的个数累加起来,即得到区内所包
数的个数。
实验程序流程图如图5-2所示。
实验程序清单(例程文件名为:)
SSTACK SEGMENT STACK
DW 64 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE
START: MOV DI, 3000H ;数据区首地址
MOV CL, [DI] ;取数据个数
XOR CH, CH
MOV BL, CH
INC DI ;指向第一个数据
A1: MOV AL, [DI]
开始
1→DX
2→BL
[BL]→AL
[BL]+1→BL
[AL]×[BL]→AX
[DX]+[AX]→DX
[AX]>200?
结束
图5-1 程序流程图
开 始
数据区首地址→DI
数据个数→CL
CH、BL置0
DI增1
数据首位=1?
N
Y
BL+1→BL
DI增1
N
CX=0?
Y
存结果
结 束
确。
正确,
单元
区内
数据
含负
A2:
CODE
TEST AL, 80H
JE A2
INC BL
INC DI
LOOP A1
MOV [DI], BL
MOV AX,4C00H
INT 21H
ENDS
END START
;检查数据首位是否为1
;负数个数加1
;保存结果
;程序终止
实验步骤
(1)按实验流程编写实验程序。
(2)编译、链接无误后装入系统。
(3)键入E3000,输入数据如下:
3000=06 (数据个数)
3001=12
3002=88
3003=82
3004=90
3005=22
3006=33 图5-2 程序流程图
(4)先运行程序,待程序运行停止。
(5)查看3007内存单元或寄存器BL中的内容,结果应为03。
(6)可以进行反复测试来验证程序的正确性。
五、排序程序设计实验
实验内容及步骤
1. 气泡排序法
在数据区中存放着一组数,数据的个数就是数据缓冲区的长度,要求采用气泡法对该数据区中的数据
按递增关系排序。
设计思想:
(1)从最后一个数(或第一个数)开始,依次把相邻的两个数进行比较,即第N个数与第N-1个
数比较,第N-1个数与第N-2个数比较等等;若第N-1个数大于第N个数,则两者交换,否则不交
换,直到N个数的相邻两个数都比较完为止。此时,N个数中的最小数将被排在N个数的最前列。
(2)对剩下的N-1个数重复(1)这一步,找到N-1个数中的最小数。
(3)再重复(2),直到N个数全部排列好为止。
实验程序清单(例程文件名为:)
SSTACK
SSTACK
CODE
START:
A1:
A2:
A3:
A4:
CODE
SEGMENT STACK
DW 64 DUP(?)
ENDS
SEGMENT
ASSUME CS:CODE
MOV CX, 000AH
MOV SI, 300AH
MOV BL, 0FFH
CMP BL, 0FFH
JNZ A4
MOV BL, 00H
DEC CX
JZ A4
PUSH SI
PUSH CX
DEC SI
MOV AL, [SI]
DEC SI
CMP AL, [SI]
JA A3
XCHG AL, [SI]
MOV [SI+01H], AL
MOV BL, 0FFH
INC SI
LOOP A2
POP CX
POP SI
JMP A1
MOV AX,4C00H
INT 21H
ENDS
END START
;程序终止
实验步骤
(1)分析参考程序,绘制流程图并编写实验程序。
(2)编译、链接无误后装入系统。
(3)键入E3000命令修改3000H~3009H单元中的数,任意存入10个无符号数。
(4)先运行程序,待程序运行停止。
(5)通过键入D3000命令查看程序运行的结果。
(6)可以反复测试几组数据,观察结果,验证程序的正确性。
2. 学生成绩名次表
将分数在1~100之间的10个成绩存入首地址为3000H的单元中,3000H+I表示学号为I的学生
成绩。编写程序,将排出的名次表放在3100H开始的数据区,3100H+I中存放的为学号为I的学生名
次。
实验程序清单(例程文件名为:)
SSTACK SEGMENT STACK
DW 64 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE
START: MOV AX,0000H
MOV DS,AX
MOV ES,AX
MOV SI,3000H ;存放学生成绩
MOV CX,000AH ;共10个成绩
MOV DI,3100H ;名次表首地址
A1: CALL BRANCH ;调用子程序
MOV AL,0AH
SUB AL,CL
INC AL
MOV BX,DX
MOV [BX+DI],AL
LOOP A1
MOV AX,4C00H
INT 21H ;程序终止
;===扫描成绩表,得到最高成绩者的学号===
BRANCH: PUSH CX
MOV CX,000AH
MOV AL,00H
MOV BX,3000H
MOV SI,BX
A2: CMP AL,[SI]
JAE A3
MOV AL,[SI]
MOV DX,SI
SUB DX,BX
A3: INC SI
LOOP A2
ADD BX,DX
MOV AL,00H
MOV [BX],AL
POP CX
RET
CODE ENDS
END START
实验步骤
(1)绘制流程图,并编写实验程序。
(2)编译、链接无误后装入系统。
(3)将10个成绩存入首地址为3000H的内存单元中。
(4)调试并运行程序。
(5)检查3100H起始的内存单元中的名次表是否正确。
发布评论