实验一 显示程序实验
一、实验目的
(1) 掌握在PC 机上以十六进制形式显示数据的方法。 (2) 掌握部分DOS 功能调用使用方法。 (3) 熟悉DVCC32JHP集成软件调试环境。
二、实验内容及说明
一般来说,有很多程序需要显示输出提示运行的状况和结果,有的还需要将数据区中的内容显示在屏幕上。本实验要求将指定数据区的字符以十六进制数形式显示在屏幕上,并通过DOS功能调用完成一些提示信息的显示。实验中可使用DOS 功能调用(INT 21H)。本实验显示第一行“Show a as hex:”,第二行“××”,××是字符“a”的十进制数(61)。 (1) 显示单个字符输出 入口:AH=02H
调用参数:DL=输出字符 (2) 显示字符串
入口:AH=09H
调用参数:DS:DX= 串地址,’$’为结束字符 (3) 键盘输入并回显 入口:AH=01H
返回参数:AL=输出字符 (4) 返回DOS 系统 入口:AH=4CH
调用参数:AL=返回码
三、实验步骤
(1) 运行DVCC32JHP软件,选择编辑Edit 菜单,根据实验内容的描述编写实验程序或选择Open菜单打开程序。
(2) 使用“ASM编译”菜单中“编译+连接+运行”选项,对实验程序进行汇编、连接。汇编、连接无误的话,就直接运行程序。观察运行结果。
(3) 或使用动态调试,进入调试环境,观察调试过程中,指令执行情况,包括各寄存器及数据区内容的变化等。
(4) 更改数据区中的数据,考察程序的正确性。
四、参考流程图
- 6 -
开始 取字节的高4位
N 数据是否>=A?
是A-F,加7H
送屏幕显示
取字节的低4位
N 数据是否>=A?
Y 是A-F,加7H
转换成ASCII码
送屏幕显示
图1-1 显示程序实验流程图
转换成ASCII码 Y 五、参考程序
参考实验程序文件名DVA1.ASM(在文件夹“ASM_汇编例程”中) 实验程序清单如下:
STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS
- 7 -
DATA SEGMENT USE16
MES DB 'Show a as hex:',0AH,0DH,'$' SD DB 'a' DATA ENDS
CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
MOV DX,OFFSET MES MOV AH,09H INT 21H MOV SI,OFFSET SD MOV AL,DS:[SI] AND AL,0F0H SHR AL,4
CMP AL,0AH
JB C2 ADD AL,07H C2: ADD AL,30H MOV DL,AL MOV AH,02H INT 21H
MOV AL,DS:[SI] AND AL,0FH CMP AL,0AH JB C3 ADD AL,07H C3: ADD AL,30H
MOV DL,AL MOV AH,02H INT 21H
START0: MOV AH,06H MOV DL,0FFH INT 21H
JE START0 MOV AX,4C00H
INT 21H CODE ENDS END START
- 8 -
实验二 数据传送实验
一、实验目的
(1) 熟悉DVCC32JHP 调试运行环境。 (2) 掌握与数据有关的不同寻址方式。
二、实验内容
本实验要求将数据段中的一个字符串传送到附加段中,并输出附加段中的目标字符串到屏幕上显示。
三、实验步骤
(1) 运行DVCC32JHP软件,选择编辑Edit 菜单编写实验程序或选择Open菜单打开程序。 (2) 使用“ASM编译”菜单中“编译+连接+运行”选项,对实验程序进行汇编、连接。汇编、连接无误的话,就直接运行程序。观察运行结果。
(3) 或使用动态调试,进入调试环境,观察调试过程中,指令执行情况,包括各寄存器及数据区内容的变化等。
(4) 更改数据区中的数据,考察程序的正确性。
四、参考程序
参考实验程序文件名DVA2.ASM(在文件夹“ASM_汇编例程”中) 实验程序清单如下:
DDATA SEGMENT MSR DB \ LEN EQU $- MSR DDATA ENDS
EXDA SEGMENT
;定义源数据段
;定义附加数据段
MSD DB LEN DUP(?) EXDA ENDS
MYSTACK SEGMENT STACK ;定义堆栈段 DW 20 DUP(?) MYSTACK ENDS
CODE SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DDATA,ES:EXDA START: MOV AX,DDATA
- 9 -
MOV DS,AX ;装载数据段寄存器
MOV AX,EXDA
MOV ES,AX ;装载附加数据段寄存器 MOV SI,OFFSET MSR ;设置SI MOV DI,OFFSET MSD ;设置DI MOV CX,LEN
NEXT: MOV AL,[SI] ;开始传输数据
MOV ES:[DI],AL
INC SI
INC DI DEC CX JNZ NEXT PUSH ES
POP DS ;将附加段寄存器指向的段值赋给数据段寄存器 MOV DX,OFFSET MSD MOV AH,9 INT 21H
START0: MOV AH,06H ;判断是否有键按下 MOV DL,0FFH INT 21H
JE START0 ;若没有转START0
MOV AX,4C00H ;有键返回DOS INT 21H
CODE ENDS END START
如果将程序主体部分的寄存器间接寻址方式改为相对寻址方式,则如下所示: MOV BX,0 MOV CX,LEN NEXT: MOV AL,MSR[BX] MOV ES:MSD[BX],AL INC BX LOOP NEXT
- 10 -