设地址指针, 取串长度?CX KEY内容?AL 搜索字串 找到否? N Y CX—1 串搜索 N 完否? 以要删除的数据的地址 为目的地址,下一个数 Y 据的地址为源地址,以 剩下的数据个数为传送 置 次数进行传送 FLAGE单元 返回 4、思考题
① 计算机钢琴程序中,INT 21 的作用是什么?指令DIV WORD PTR[TABLE+BX]中为什么要用操作符WORD PTR?延时子程序DELAY中为什么要把AX、CX压入栈?
② 在求最大和最小值的程序中,有指令MOV MINVAL,AL和MOV MAX MAXVAL,AL将第一个数存入这两个单元,可以用哪两个立即数直接存入这两个单元也可达到同样效果? ③ 若求无符号数据块的最大和最小值,那么程序要作哪些修改? ④ 删除一个升序或降序字符串中一个字符时,程序应如何修改可使在找不到这个字符时搜集次数减少?
四、实验报告要求
1.对所有程序写上较详细的注释。 2.整理出实验中数据和运行结果。
3.总结DEBUG程序、MASM宏汇编、LINK连接程序的调试程序的方法和经验。 4.根据思考题写出答案和运行结果。
16
实验三 DOS系统功能调用及模块化程序设计
一、实验目的
2、 熟悉DOS系统中基本功能子程序的作用及其调用方法。
3、 结合DOS系统中键盘和显示功能子程序的调用和汇编语言源程序结构设计有关程序。 4、 掌握复杂程序的设计思想—模块化程序设计的方法。
二、实验设备
PC机一台,装有DOS基本系统和MASM宏汇编软件。
三、实验内容及步骤
(一)DOS键盘、显示基本功能子程序调用
DOS提供了许多系统功能子程序可由程序设计者调用,其中最基本的是键盘和显示操作功能的调用,具体调用的方法可参阅教科书。
1、 显示缓冲区的字符串 1)实验程序: DSEG SEGMENT STRING DB ‘Welcome to DONG HUA University!’,0dH,0aH,’$’ DSEG ENDS STACK SEGMENT PARA STACK ‘STACK’ DB 256 DUP (?) STACK ENDS CSEG SEGMENT MAIN PROC FAR ASSUME CS: CSEG, DS: DSEG SS: STACK START: PUSH DS MOV AX, 0 PUSH AX MOV AH, 9 MOV DX, SEG STRING MOV DS, DX MOV DX, OFFSET STRING INT 21H RET
17
MAIN ENDP CSEG ENDS END START 2) 实验步骤: (1)建立源程序文件。
(2)用MASM宏汇编程序和LINK连接程序生成执行程序。 (3)运行执行程序,输入不同字母,观察结果。
2、键盘输入小写字母,显示器显示大写字母 1)实验程序:
CSEG SEGMENT MAIN PROC FAR ASSUME CS:CSEG START:PUSH DS MOV AX, 0 PUSH AX BEGIN: MOV AH,1
INT 21H
CMP AL, ‘a’ JB STOP CMP AL, ‘z’ JA STOP SUB AL, 20H MOV DL, AL MOV AH, 2 INT 21H JMP BEGIN STOP: RET MAIN ENDP CSEG ENDS END START
2) 实验步骤: (1)建立源程序文件。
(2)用MASM宏汇编程序和LINK连接程序生成执行程序。 (3)运行执行程序,输入不同字母,观察结果。
3、从键盘输入一个二位十进制的月份数(01-12),显示相应月份的英文缩写名
1)程序及其结构
程序采用子程序的结构形式,子程序有:将输入的二位月份数转换为二进制数的子程序;从字符
18
表中查找相应的英文缩写的子程序;将月份的英文字母显示在屏幕上的子程序。 程序如下: DATASG THREE MONIN ALFMON MONTAB DATASG CODESG MAIN MAIN INPUT RETURN: INPUT:
SEGMENT PARA ‘DATA’ DB 3 DB 3,4 DUP(?) DB ‘???’,’$’ DB ‘JAN’,’FEB’,’MAR’,’APR’,’MAY’,JUN’ DB ‘JUL’,’AUG’,’SEP’, ’OCT’,’NOV’,’DEC’ ENDS SEGMENT PARA ‘CODE’ ASSUME CS:CODESG,DS:DATASG PROC FAR PUSH DS SUB AX, AX PUSH AX
MOV AX, DATASG
MOV DS, AX MOV ES, AX CALL INPUT CALL LOCATE CALL DISPLAY RET ENDP PROC NEAR ; 键盘输入并将ASCⅡ码转换二进制数的子程序PUSH DX MOV AH, 0AH ; 键盘输入月份数 LEA DX, MONIN INT 21H MOV AH, MONIN+2 ; 将月份数字的ASCⅡ码取入AH和AL MOV AL, MONIN+3 XOR AX, 3030H ; 将ASCⅡ码转换为BCD码 CMP AH, 00 JZ RETURN SUB AH, AH ADD AL, 10 POP DX RET ENDP 19
LOCATE LOCATE: DISPLAY DISPLAY CODESG
PROC
PUSH PUSH PUSH LEA DEC MUL ADD MOV CLD LEA REP POP POP POP RET ENDP PROC PUSH LEA MOV INT POP RET ENDP ENDS END
NEAR ; 将月份数字转换为英文缩写字母的子程序 SI DI CX
SI, MONTAB AL THREE SI, AX CX, 03 DI, ALFMON MOVSB CX DI SI
NEAR ; DX
DX, ALFMON AH, 09 21H DX
屏幕显示子程序
MAIN
(二)采用DOS功能调用设计源程序,并运行调试程序
1、十进制加法和结果显示程序(自行设计) 1)程序设计要求
将数据段DSEG中的ADDOP1定义的双字变量的4位十进制数和附加段ESEG中的ADDOP2定义的双字变量的4位十进制数相加,和存放于数据段DSEG中的SUM中,采用DOS显示功能调用将和显示在屏幕上。 2) 实验步骤: (1)建立源程序文件。
(2)用MASM宏汇编程序和LINK连接程序生成执行程序。
20