实验七 子程序设计实验
一、实验目的
(1) 掌握子程序的定义和调用方法。
(2) 掌握系统功能调用程序的使用和编写方法。
二、实验内容及说明
在汇编程序设计中,用户通常会将常用的具有特定功能的程序段编制成子程序使用。一般过程定义(子程序)伪操作的格式如下:
procedure name PROC Attribute …
procedure name ENDP
其中Attribute 是指类型属性,可以是NEAR 或FAR ,调用程序和过程在同一个代码段中使用NEAR 属性,不在同一个代码段中,使用FAR。
1.数据移动实验
本实验要求将指定数据区的数据搬移到另一个数据区,并通过子程序调用的方法将搬移的数据显示在屏幕上。 源目源数据块 数标 据数块据 目 块标 目标数据 数
据块 源数据块 图7-1 源数据块和目标数据块在存储器中的位置示意
源数据块和目标数据块在存储器中的位置可能有三种情况,如图7-1 所示。对于两个数据块分离的情况(上图最左边),数据的传送从数据块的首地址开始,或者从数据块的末地址开始均可。但对于有部分重叠的情况(上图右边两种),则要加以分析,否则重叠部分会因搬移而遭到破坏。所以搬移过程可以通过以下两个方式完成:当源数据块首地址> 目标块首址时,从数据块的首地址开始传送数据;当源数据块首地址< 目标块首址时,从数据块的末地址开始传送数据。
2 .数码转换及显示实验
有时当系统运行或者程序运行期间在遇到某些特殊情况时,需要计算机自动执行一组专
- 41 -
门的例行程序来进行中断处理。这段例程称为中断子程序。中断分为内部中断和外部中断两类。象除法错或者程序中为了作某些处理而设置的中断指令等属于内部中断。外部中断则主要用来处理I/O 设备与CPU 之间的通信。
在汇编语言程序设计中使用系统功能调用程序,只需要通过MOV 指令,将中断参数装到 与此有关的寄存器中,然后用INT 指令调用所需中断。如果希望中断处理程序是用户自己编写的一段程序,则需要修改对应中断的中断处理程序入口。微机系统中可以使用0-255 共256个中断。当80x86系统工作于实模式的时候,内存的000H-3FFH 被用于作为中断向量表,向量表中包含了256 个中断的中断子程序入口(中断向量地址),向量表内容如图7-2 所示。
本实验要求利用47H 号中断将一组字符转换成十六进制数码,并在屏幕上显示出来。
3FFH 3FCH 084H 07FH 080H … … CS基地址 IP偏移量 系统用或保留 中断向量码1 除法错 中断向量码0 除法错 供用户使用 004H 000H CS基地址 IP偏移量
图7-2 中断向量表
三、实验步骤
1. 数据移动实验
(1) 运行DVCC32JHP 软件,选择编辑Edit 菜单编写实验程序。在数据段中声明16 字节的数据为:11H,22H ,33H,44H ,55H,66H,77H,88H,99H,0AAH,0BBH,0CCH,0DDH,0EEH,0FFH,00H ;
(2) 使用编译Compile 菜单中编译Compile 和连接Link 对实验程序进行汇编、连接;
(3) 使用调试命令调试程序,观察源数据区的数据,并在程序运行结束后观察目的数据区的数据,看传输是否正确。
(4) 更改数据区中的数据,考察程序的正确性。
2.数码转换及显示实验
(1) 运行DVCC32JHP软件,选择编辑Edit 菜单编写实验程序。
(2) 使用“ASM编译”菜单中“编译+连接+运行”选项,对实验程序进行汇编、连接。汇
- 42 -
编、连接无误的话,就直接运行程序。观察运行结果。 (3) 更改数据区中的数据,考察程序的正确性。
四、参考程序
1. 数据移动实验
源文件名DVA7_1.ASM(在文件夹“ASM_汇编例程”中) 实验程序清单如下:
STACK1 SEGMENT STACK
DW 256 DUP(?) STACK1 ENDS
DDATA SEGMENT
MES DB 'The data in buf2 are:',0AH,0DH,'$' BUF1 DB
11H,22H,33H,44H,55H,66H,77H,88H,99H,0AAH,0BBH,0CCH,0DDH,0EEH,0FFH,00H BUF2 DB 20H DUP(0) DDATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DDATA
START: MOV AX,DDATA MOV DS,AX MOV CX,0010H
MOV SI,OFFSET BUF1 MOV DI,OFFSET BUF2 CMP SI,DI JA A2 ADD SI,CX ADD DI,CX DEC SI DEC DI A1: MOV AL,[SI] MOV [DI],AL DEC SI DEC DI DEC CX JNE A1
- 43 -
JMP A3
A2: MOV AL,[SI] MOV [DI],AL INC SI INC DI
DEC CX JNE A2
A3: MOV DX,OFFSET MES MOV AH,09H
INT 21H MOV CX,10H
MOV SI,OFFSET BUF2 A4: CALL SHOW INC SI MOV DL,20H MOV AH,02H INT 21h LOOP A4
START0: MOV AH,06H MOV DL,0FFH INT 21H
JE START0 MOV AX,4C00H INT 21H
SHOW PROC NEAR 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
START0 DOS
4位 A以上的数
4位
- 44 -
;判断是否有键按下
;若没有转;有键返回;取高;是否是;显示字符 ;取低
CMP AL,0AH
JB C3 ADD AL,07H C3: ADD AL,30H MOV DL,AL
MOV AH,02H INT 21H RET ENDP
;显示字符
CODE ENDS
END START
2.数码转换及显示实验
源文件名DVA7_2.ASM(在文件夹“ASM_汇编例程”中) 实验程序清单如下: STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS
DDATA SEGMENT CSBAK DW ? IPBAK DW ? MKBAK DB ? SW DW ?
MES DB 'The data in buf1 are:',0AH,0DH,'$'
BUF1 DB 11H,22H,33H,44H,55H,66H,77H,88H,99H,0AAH,0BBH,0CCH,0DDH,0EEH,0FFH,00H DDATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DDATA START PROC FAR MOV AX,DDATA MOV DS,AX
MOV AX,0 ;修改47H号中断的中断矢量 MOV ES,AX
MOV DI,4*47H MOV AX,ES:[DI]
MOV IPBAK,AX ;保存原有IP
MOV AX,OFFSET MYINT ;修改为用户自定义中断入口 CLD
- 45 -