实验报告子程序设计实验

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验5 子程序实验

一.实验目的

1.掌握主程序与子程序之间的调用关系及调用方法;

2.掌握子程序调用过程中近程调用与远程调用的区别;

3.掌握通过堆栈转送参数的方法。

4. 掌握多模块程序设计方法

二.实验容

1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。

DATAS SEGMENT

BUF DB

00000111B,00100001B,00100010B,00000011B,00000101B,10000010B,10010011B,0010010 0B,11100010B,01010010B

CAN DB $-BUF ;定义常量CAN

DATAS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS

MAIN PROC FAR ;主程序块

START:

MOV AX,DATAS

MOV DS,AX

MOV CL,10

LEA SI,BUF

LOOP1: ;调用子程序语句

call HEXAC

call DISP

DEC CAN

JNZ LOOP1

EXIT:

MOV AH,4CH

INT 21H

MAIN ENDP

HEXAC PROC NEAR ;二进制转换成十六进制子程序

MOV BL,[SI]

INC SI

RET

HEXAC ENDP

DISP PROC NEAR ;显示子程序

MOV CL,4

MOV CH,2

MOVE: ;移位语句

ROL BL,CL

MOV DL,BL

AND DL,0FH

ADD DL,30H

CMP DL,'9'

JBE PRINT

ADD DL,07H

PRINT:

MOV AH,02H ;显示语句

INT 21H

DEC CH

JNZ MOVE

MOV DL,' '

MOV AH,02H

INT 21H

RET

DISP ENDP

CODES ENDS

END START

2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。

DATA SEGMENT

STR1 DB 0ah,0dh,'PLEASE INPUT YOUR STRING:$'

STR2 DB 0ah,0dh,'THE NUMBER OF b is:$'

TABLE DB 50, ? ,50 DUP(?),'$'

DATA ENDS

CODE SEGMENT

ASSUME CS: CODE, DS: DATA

START:

MOV AX,DATA

MOV DS,AX

LEA DX,STR1

INT 21H

LEA DX,TABLE

MOV AH,0AH

INT 21H

LEA SI , TABLE

MOV CL, [SI+1]

MOV CH, 0

INC SI

INC SI

MOV AL,'b'

MOV AH,0

PUSH SI

PUSH CX

PUSH AX

CALL FAR PTR CHECK

POP AX

MOV CL,AL

LEA DX,STR2

MOV AH,9

INT 21H

MOV DL,CL

AND DL, 0FH

CMP DL,9

JBE CAN

ADD DL,7

CAN:

ADD DL,30H

MOV AH,2

INT 21H

EXIT:

MOV AH,4CH

INT 21H

CODE ENDS

SCODE SEGMENT

ASSUME CS:SCODE CHECK PROC FAR

PUSH BP

MOV BP,SP

MOV SI,[BP+10]

MOV CX, [BP+8]

MOV AX, [BP+6]

XOR AH, AH AGAIN:

JNE CAN1

INC AH

CAN1:

INC SI

LOOP AGAIN

MOV AL, AH

MOV [BP+10],AX

POP BP

RET 4

CHECK ENDP

SCODE ENDS

END START

3. 请编写一个程序来实现简单的程序菜单显示。(采用多模块程序设计方法)

显示一个菜单要求用户从下表中选择:

(1)HEXAC GAME (对应-->程序1)

(2)CHAR STATISTICS PROGRAM (对应-->程序2)

(3)PRESS “ESC”TO QUIT

用户作出选择1~3时,显示输出要执行操作的名字,如“Your selection is 1,the program will execute HEXAC NUMBER GAME!”然后转向相应的程序去执行,执行结束前进行退出的判断,显示一个提示信息“will you continue program really?(Y:N)”要求用户从键盘键入字符,若是“Y”键,则继续程序的执行,若是“N”键,则返回到菜单。若用户选择3,要求程序显示提示信息“Please press ESC key to exit!”,并能按要求正确退出。

DATAS SEGMENT

OPT DW YI

DW ER

menu DB 0DH,0AH,'THE MENU:' ;显示菜单

DB 0DH,0AH,'(1)HEXAC GAME' ;对应-->程序1

DB 0DH,0AH,'(2)CHAR STATISTICS PROGRAM';对应-->程序2

DB 0DH,0AH,'(3)PRESS "ESC" TO QUIT$'

BUF DB 00000111B,00100001B,00100010B,00000011B,00000101B,10000010B,10010011B,0010010 0B,11100010B,01010010B

CAN DB $-BUF ;定义常量CAN

str1 DB 0DH,0AH,'Your selection is 1,the program will execute HEXAC GAME!$'

str2 DB 0dh,0ah,'Your selection is 2,the program will execute CHAR STATISTICS PROGRAM!$'

str3 DB 0DH,0AH,'will you continue program really?(Y:N)$'

str4 DB 0DH,0AH,'Please press ESC key to exit!$'

TABLE DB 50, ? ,50 DUP(?),'$'

char1 db 0ah,0dh,'PLEASE INPUT YOUR STRING:$'

相关文档
最新文档