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

10D

n1

10

nn1

n

D

0

10

0

D

i0

i

10

i

(1)

D

i

代表十进制数0,1,2,…,9;

上式转换为:

D

i0

n

i

10

i

(((D

n

10D

n1

)10D

n2

)10D

1

)10D

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,最大可转换为五位十进制数。

五位十进制数可表示为:

ND

4

10

4

D

3

10

3

D

2

10

2

D

1

10D

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起始的内存单元中的名次表是否正确。