实验二 循环与子程序程序设计
一、 实验目的
1) 加深对循环结构的理解。 2)掌握循环程序的设计方法。 3)学习子程序的定义和调用方法。
4)掌握子程序、子程序的嵌套、递归子程序的结构。 5) 掌握子程序设计、编制及调试。
6) 熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。
二、 实验内容
1) 编制程序计算S=1+2·3+3·4+4·5+……+N(N+1)+……直到N(N+1)大于200为止,并将结果由屏幕上显示出来。
2)将从3000H内存单元开始的100个字节存储单元全部清0。 3)编制在屏幕上显示九九乘法表的程序。 4)编制在屏幕上显示用*组成的三角形的程序。
5)设有五个字数据存放在以BUF为首地址的内存单元中,要求采用调用多个字数据相加的子程序方法编程,和的低位字放在RESULT单元,和的高位字放在RESULT+2单元,并将结果显示在屏幕上。
6)编写一个递归子程序,计算指数函数Xn的值,其中X,n从键盘输入。
三、 源程序
EXAM2-1
DATA SEGMENT
BUF DB’S=1+2×3+3×4+4×5+…+N(N+1)+…=’,’$’ RES DW 4 DUP(0),’$’ DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA MOV DS, AX
MOV DX, OFFSET BUF MOV AH, 09H
INT 21H
MOV DX, 1
MOV BL, 2
NEXT: MOV AL, BL INC BL MUL BL
ADD DX, AX CMP AX, 200 JNA NEXT
MOV CX, 0004H
MOV DI, OFFSET RES ADD DI, 03H NEXT1:MOV AX, DX AND AX, 000FH CMP AL, 0AH JB NEXT2 ADD AL, 07 NEXT2:ADD AL, 30H MOV [DI],AL DEC DI PUSH CX
MOV CL,04 SHR DX,CL POP CX
LOOP NEXT1
MOV DX, OFFSET RES MOV AH, 09H INT 21H
MOV AH, 4CH INT 21H CODE ENDS
END START
执行程序EXAM2-1·EXE,屏幕上显示结果: S=1+2×3+3×4+4×5+…+N(N+1)+…=045F
EXAM2-2
ORG 2000H 2000 BF0030 MOV DI, 3000 2003 B1 MOV CL,
2005 C60500 MOV BYTE PTR[DI],0 2008 47 INC DI 2009 FEC9 DEC CL 200B 75F8 JNZ 2005 200D F4 HLT
EXAM2-3
DATA SEGMENT
ATAD DB ?, 2AH, ?, 3DH, ?, ?, 20H, '$'
ATAD1 DB ?, 2AH, ?, 3DH, ?, ?, 0DH, 0AH, '$' DATA ENDS
STACK SEGMENT STACK DB 20H DUP(0) STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA START:
MOV AX, DATA MOV DS, AX MOV CL, 09H MOV BL, 00H OKL:
MOV AL, 00H INC BL OK1:
INC AL PUSH AX CMP BL, AL JZ OK
MOV BH, AL MUL BL
MOV DI, OFFSET ATAD CALL OKP POP AX JMP OK1 OK:
MOV BH, AL MUL BL
MOV DI, OFFSET ATAD1 CALL OKP POP AX LOOP OKL MOV AH, 4CH INT 21H OKP PROC PUSH AX PUSH BX
PUSH CX
ADD BX, 3030H MOV [DI], BH
MOV [DI + 02H], BL MOV CX, 0AH MOV DH, 00H OKL2:
CMP AX, CX JS OK2
ADD CX, 0AH INC DH JMP OKL2 OK2:
SUB CX, 0AH SUB AX, CX MOV AH, DH ADD AX, 3030H MOV [DI + 04H], AH MOV [DI + 05H], AL MOV DX, DI MOV AH, 09H INT 21H POP CX POP BX POP AX RET OKP ENDP CODE ENDS END START
执行程序EXAM2-2·EXE,屏幕上显示结果: 1*1=01
1*2=02 2*2=04
1*3=03 2*3=06 3*3=09
1*4=04 2*4=08 3*4=12 4*4=16
1*5=05 2*5=10 3*5=15 4*5=20 5*5=25
1*6=06 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=07 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=08 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=
1*9=09 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
EXAM2-4
CODES SEGMENT ASSUME CS:CODES START:
XOR BX,BX MOV DL,2AH MOV CX,9
LOP: PUSH CX INC BL MOV CL,BL MOV DL,2AH LOP2: MOV AH,02H INT 21H LOOP LOP2 POP CX
MOV DL,0AH MOV AH,02H INT 21H
MOV DL,0DH MOV AH,02H INT 21H CMP BL,9 JZ ENDPRO LOOP LOP ENDPRO:
MOV AH,4CH INT 21H CODES ENDS
END START
执行程序EXAM2-4·EXE,屏幕上显示结果: * ** *** **** ***** ****** ******* ******** *********
EXAM2-5
STACK SEGMENT STACK DB 1024 DUP(0) STACK ENDS DATA SEGMENT
BUF DW 0F101H,110DH,52H,100H,456H COUNT =($-BUF)/2
RESULT DW 4 DUP(?),'$' DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK WDADD PROC PUSH DI MOV AX, 0 MOV DX, 0
MOV DI, OFFSET BUF NEXT2: ADD AX, [DI] JNC NEXT1 INC DX
NEXT1: ADD DI, 2 LOOP NEXT2 POP DI RET
WDADD ENDP SHOW PROC PUSH CX PUSH DI
MOV CX, 04H
MOV DI, OFFSET RESULT MOV BX, AX ADD DI, 07H
BBB: MOV AX, BX AND AX, 000FH CMP AL, 0AH JB QQQ
ADD AL, 07H
QQQ: ADD AL, 30H MOV [DI], AL DEC DI PUSH CX
MOV CL, 04 SHR BX, CL POP CX LOOP BBB
MOV CX, 0004H CCC: MOV AX, DX AND AX, 000FH CMP AL, 0AH JB DDD
ADD AL, 07H
DDD: ADD AL, 30H MOV [DI], AL DEC DI
PUSH CX
MOV CL, 04H SHR DX, CL POP CX LOOP CCC POP DI POP CX RET
SHOW ENDP
BEGIN: MOV AX, DATA MOV DS, AX MOV CX, COUNT CALL WDADD CALL SHOW
MOV DX, OFFSET RESULT MOV AH, 09H INT 21H
MOV AH, 4CH INT 21H CODE ENDS END BEGIN
执行程序EXAM2-5·EXE,屏幕上显示结果: 000107B6