MOV AH,1 ;保存需要判断大小的字符 INT 21H CMP AL,39H JA ERO CMP AL,30H JB ERO
MOV [BX],AL MOV AH,1 INT 21H CMP AL,39H JA ERO CMP AL,30H JB ERO
MOV [BX+1],AL MOV AH,1 INT 21H
CMP AL,0DH JZ FINISH CMP AL,' ' JZ RE JMP ERO RE:
INC BX INC BX JMP RE1
ERO: MOV DX,OFFSET STR4 MOV AH,09H INT 21H
MOV DX,OFFSET STR3 MOV AH,09H INT 21H
MOV DX,OFFSET STR4 MOV AH,09H INT 21H JMP RE1 FINISH:
MOV [BX+2],AL RET INPUT ENDP ;比较大小子程序 COMPARE PROC
LEA BX,BUFFER MOV AH,[BX] MOV AL,[BX+1]
;判断是否符合条件 ;保存结束符 RE2:
ADD BX,2 ;比较高位 CMP AH,[BX] JZ RE3 JB RE4
MOV AH,[BX] MOV AL,[BX+1] JMP RE4
RE3: ;高位相等,比较低位 CMP AL,[BX+1] JB RE4
MOV AL,[BX+1] JMP RE4
RE4: MOV CL,[BX+2] CMP CL,0DH JNE RE2
MOV MIN,AX RET
COMPARE ENDP ;输出子程序
OUTPUT PROC
MOV AH,09H
MOV DX,OFFSET STR4 INT 21H
MOV AH,09H
MOV DX,OFFSET STR2 INT 21H
LEA SI,MIN+1 MOV DL,[SI] MOV AH,02H INT 21H
MOV SI,OFFSET MIN MOV DL,[SI] MOV AH,02H INT 21H RET
OUTPUT ENDP CODE ENDS
END START
四、程序流程图
;判断是否结束 ;保存最小值 ;先输出高位 ;再输出低位 开始 结束程序 程序初始化 显示输出最小值 调用输入子程序 调用显示子程序 显示提示语 返回主程序 报错提示重新输入 否 输入字符判断是否为0~9 是 是否结束 否 继续输入字符判断 空格 比较低位 是 保存较小的数 否 比较高位是否相等 否 否 输入结束符或间隔符 提取前一个数与后一个数比较 回车 返回主程序 调用比较子程序
五、程序运行结果
六、预习题:
1.如何将输入的两个字符(0 -- 9)变为十进制或二进制数?
答:可以通过将字符的减去30H再乘以10D,加上个位的值(同样要将ASCII码减去30H变为十进制数)即可得两个字符的十进制数。
2.如何将选出的最小值(二进制或十进制)变为 ASCII 码再进行显示?
答:选出最小十进制数后可以通过除十得到余数和商,商为高位,余数为低位,分别对这两个加30H即可到得其ASCII码。
3.你觉得采用二进制运算还是十进制运算更适合于这个实验?
答:个人觉得采用二进制运算更简便,这样可以直接使用ASCII码比较,使问题简化。
七、心得体会: 做这个实验的过程中出了一些错误,最开始的代码在运行时输出乱码,这个问题困扰了我很久。后来我通过单步调试,发现是因为调用子程序时没有注意现场保护,几个寄存器被多次赋值,导致结果显示时不仅不能输出正确结果,程序还跑飞了。所以比较和显示时都出现了问题。经过这次实验,我发现汇编编程过程中一定要注意,在子程序调用时要做好现场保护,毕竟汇编不像高级语言,子程序压栈出栈的过程对编程者并不是透明的。
实验四 子程序设计 一、实验目的:
1.进一步掌握子程序设计方法;
2.进一步掌握基本的 DOS 功能调用.
二、实验内容:
1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入. 2.统计检查每个学生的名次. 3.将统计结果在荧幕上显示.
4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可能考虑美观. 5.输入要有检错手段
三、源程序
DATA SEGMENT BUFFER DB 100 ;定义缓冲区,最多允许输入100个字符(包括回车) DB ? ;存放实际输入的字符数(不包括回车) DB 100 DUP (?) ;存放输入的字符串 STR1 DB 'Input the score of the students:',0DH,0AH,'$'
STR2 DB 0DH,0AH,'Error! Please input the score again:',0DH,0AH,'$' VAR1 DW ? VAR2 DW ? FLA DB ?
NUM DB 100 DUP(?) DATA ENDS
STACK SEGMENT STACK 'STACK' DB 100 DUP ('s') STACK ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AH,09H ;输出提示语 MOV DX,SEG STR1 MOV DS,DX MOV DX,OFFSET STR1 INT 21H
INPUT: MOV DX,SEG BUFFER ;输入成绩 从BUFFER+2开始的单元存放 MOV DS,DX MOV DX,OFFSET BUFFER MOV AH,0AH INT 21H LEA DI,NUM ;DI指向存放区域首地址