实验七 循环程序设计
实验内容:
1. 编制程序计算S=1+2?3+3?4+4?5+??+N(N+1)+??直到N(N+1)大于200为止,并将结果由屏幕上显示出来。其程序的流程图如图7. 1所示。 2. 将从3000H内存单元开始的100个字节存储单元全部清0。本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。
源程序:
(1)编制程序计算S=1+2?3+3?4+4?5+??+N(N+1)+??直到N(N+1)大于200为止,并将结果由屏幕上显示出来。 DATA SEGMENT
RESULT DW ? DATA ENDS
STACK SEGMENT STACK DB 10 DUP(0) STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV DX,1 MOV BL,2 LP: MOV AL,BL ADD BL,1 MUL BL
ADD DX,AX ;DX中存放sum和 CMP AX,200 JG OUTPUT LOOP LP OUTPUT: MOV BX,DX MOV CX,4
LP2: ROL BX,1 ;BL存放和,移位,从高到低一位一位显示 ROL BX,1 ROL BX,1 ROL BX,1 MOV AX,BX
AND AX,000FH ;取BL中低四位 XOR DX,DX
ADD AL,30H ;十六进制转换成ASCII码加30H
CMP AL,3AH ;0—9数字与A—F的ASCII码不连续 JB PIT
ADD AL,07H ;若比A(10)大,还要再加07H PIT: MOV DL,AL MOV AH,02H INT 21H
LOOP LP2 MOV AH,4CH INT 21H CODE ENDS
END START
运行结果:
(2)将从3000H内存单元开始的100个字节存储单元全部清0。本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。
DATA SEGMENT ORG 3000H
X DB 100 DUP(?) DATA ENDS
STACK SEGMENT STACK DB 10 DUP(?) STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX LEA SI,X MOV CX,100
LP: AND BYTE PTR[SI],00H INC SI LOOP LP
MOV AH,4CH INT 21H CODE ENDS END START
运行结果:
先将内存单元赋值,用debug的E指令赋值,用D指令查看内存中的数据
再运行程序,将内存单元全部清零
实验八 子程序设计
1、程序说明:编制一程序,要求键入一个班的学生成绩,并存放于50字的ERADE数组中,然后根据ERADE中的成绩,把学生名次填入50字的RANK数组中,再按学号顺序把名次从终端上显示出来。 提示:
① 程序MAIN
功能:根据输入的学生成绩,计算并显示出学生名次。 ② 子程序INPUT
功能:接收一个班级学生的成绩,各成绩之间用空格隔开。
③ 子程序RANKP
功能:计算一个班级学生的名次。 ④ 子程序OUTPUT
功能:输出(显示)一个班级的学生名次 ⑤ 子程序DECIBIN
功能:十进制转换二进制,存入BX ⑥ 子程序BINDEC
功能:十进制转换二进制,并在屏幕上显示。 ⑦ 子程序DEC_DIV
功能:BX的内容除以CX的内容,并在屏幕上显示一位商。
源程序:
DATA SEGMENT
GRADE DW 50 DUP( ) RANK DW 50 DUP( )
ENTER DB 'Grades:',24H ;提示用户输入成绩
ERROR DB 13,10,'Error!',13,10,24H ;用户输入的格式出错 SHOW DB 'Rank: ',24H
COUNT DW 0 ;统计输入的成绩个数 CR DB 13,10,24h ;换行 DATA ENDS
STACK SEGMENT STACK DB 400 DUP(0) STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK START:
MOV AX,DATA MOV DS,AX
MOV ES,AX
CALL INPUT
CALL RANKP
CALL OUTPUT
MOV AH,01H INT 21H MOV AX,4CH INT 21H
;INPUT程序段
;以学号为序从键盘输入一个班的学生成绩,各个成绩之间 用逗号格开,最后以回车符结束。
;然后把一个班的成绩存入grade数组。 INPUT PROC NEAR
LEA DX,ENTER MOV AH,9
INT 21H ;提示用户输入
MOV SI,0
MOV COUNT,0 ;将输入用户的输入个数置0
_ENTER: ;对用户的输入进行监视,对错误输入立即进行出错处理 CALL DECIBIN ;调用DECIBIN ;对用户输入进行处理 INC COUNT
CMP DL,',' ;与','比较,相同则保存成绩,不同出错 JE _STORE
CMP DL,0DH ;与回车键进行比较,回车则成绩输入结束 JE _ENDENTER
JNE _ERROR ;出错处理:显示出错信息 _STORE: ;保存成绩 MOV GRADE[SI],BX ADD SI,2 JMP _ENTER _ERROR:
LEA DX,ERROR MOV AH,9 INT 21H
_ENDENTER: ;用户结束成绩输入 MOV GRADE[SI],BX
MOV DX,OFFSET CR ;换行 MOV AH,9 INT 21H RET INPUT ENDP
;RANKP程序段
;从grade数组取得一个班的成绩,以学号为序计算出该班每个学生的名次存入rank数组。