实验三代码转换程序设计
一.实验目的:
1.掌握几种最基本的代码转换方法; 2.运用子程序进行程序设计.
二.实验内容:
1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来. 2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明. 3.对输入要有检错措施,以防止非法字符输入,并有适当的提示.
4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图.
三、创新功能:
1、成功避免空格影响,在输入数据时,用户可以键入无限多用于分隔的空格,不会影响程序的输入,按回车结束一串待比较数的输入。 2、扩充了题目要求,将判断范围扩展到负数领域,在一串数中允许有负数输入,且可以输出最小数。
运行结果如下,可以看到,负数存在时仍可正常判断,以回车作为结束标志
四.预习题:
1.如何将输入的两个字符(0 -- 9)变为十进制或二进制数?
答:将(高位ASCII码-‘0’)*10+低位ASCII码-‘0’即为对应10进制数。 将高位ASCII码-‘0’后左移一位保存,再左移两位,求两者之和,在加上低位ASCII
码-‘0’则可通过移位转移成二进制数。
2.如何将选出的最小值(二进制或十进制)变为 ASCII 码再进行显示? 答:可将两位数除10,对AL中的商+‘0’显示,AH中的余数+‘0’显示。 3.你觉得采用二进制运算还是十进制运算更适合于这个实验? 答:二进制运算。直接通过ASCII码高低位判断大小。
五、流程图:
判断当前输入是否为空格 开始 是 判断字符是否为回车 是 输出最小值 是 是否输入‘-’号 读下一个字符 读下一个字符 合法输入? 显示不合法,终止程序 合法输入? 是 判断是否为最小负数 是 更新CH,CL 更新BH,BL 判断是否为最小正数
六、代码分析
JUDGE MACRO; 判断字符是否合法 CMP AL,'0'
JB WRONG ;不合法转去wrong处执行 CMP AL,'9' JA WRONG ENDM
PRESENT MACRO X,Y ;显示两个字符 MOV AH,02H MOV DL,X INT 21H MOV AH,02H MOV DL,Y
INT 21H ENDM
INPUT MACRO ;从键盘读取字符 MOV AH,01H INT 21H
ENDM DATA SEGMENT
STRING DB 'The min is:','$'
STRING1 DB 0DH,'Input illegal!','$' STRING3 DB 'Please input number: ','$' DATA ENDS
STACK SEGMENT 'STACK' DB 100 DUP(?) STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE START: MOV DX,SEG DATA MOV DS,DX MOV BH,9+'0' MOV BL,9+'0' MOV CH,'0'
MOV CL,'0' MOV AH,09H
;BH中存放正的最小值的十位,并将其转换为ASCII码
;BL中存放正的最小值的个位 ;CH中存放负的最小值的十位 ;CL中存放负的最小值的十位
MOV DX,SEG STRING3 MOV DS,DX LEA DX,STRING3 INT 21H LOOP1: INPUT
CMP AL,20H JZ LOOP1 CMP AL,0DH JZ NEAR PTR RA CMP AL,'-'
;循环找到第一个不是空格的字符
;判断是否输入结束 ;判断数的符号
JZ NEAR PTR NEGT ;负数则转去NEGT处执行 JUDGE ;判断数的合法性 CMP AL,BH JNA NEXT K: INPUT
;输入的值与最小正数的十位相比较
;当前输入的值有可能比得到的最小数小 ;把下一个不符合条件的字符读出
JMP NEAR PTR LOOP1 RA: JMP NEAR PTR EXIT WRONG: CALL ILLEGAL
JMP NEAR PTR ENDD NEXT: MOV BH,AL INPUT JUDGE CMP AL,BL JA K
MOV BL,AL
JMP NEAR PTR K NEGT: INPUT JUDGE CMP AL,CH JB K
;判断当前输入的正数是否为最小数
;判断当前输入的负数是否为最小负数
;是则更新CH的值
MOV CH,AL INPUT JUDGE CMP AL,CL JB K; MOV CL,AL JMP LOOP1
EXIT: PRESENT 0DH,0AH MOV AH,09H MOV DX,SEG STRING MOV DS,DX LEA DX,STRING INT 21H CMP CH,'0' JNZ K1 CMP CL,'0'
;判断最小数的符号是否为负(通过负数最高位是否被修改判断) ;不为0则说明最小数为负数
JNZ K1
PRESENT BH,BL ;均不满足跳转条件说明最小数是正数,直接进行显示 JMP NEAR PTR ENDD
K1: MOV AH,02H MOV DL,'-' INT 21H
PRESENT CH,CL JMP ENDD
ENDD: MOV AX,4C00H INT 21H
ILLEGAL PROC
;输出最小的负数
;显示不合法字符串
MOV AH,09H MOV DX,SEG STRING1 MOV DS,DX LEA DX,STRING1 INT 21H RET ILLEGAL ENDP CODE ENDS END START
七、程序设计思路与总结
程序分为字符输入模块、字符显示模块、判断合法模块、以及主程序的比较模块。
采取逐字符判断,若检测到非法输入则立即停止输入。输入时优先判读空格,找到第一个不为空格的数判断其合法性,如果合法则认为它是最高位,和当前最小值的最高位比较,若比当前最小值的最高位大则直接丢弃,同时丢弃下一个低位字符,否则转入低位的比较。若输入的数比当前的数小,则更新最小值。循环判断直至输入结束。其中判断过程中之间按ASCII码判断,无需转换成十进制数。
在拓展功能中,增加了负数的判断,主要是首字符的读取,如果是‘-’号不能认为是非法输入,因此要优先判断,每次读取一个数判断正负,用两个寄存器分别存储负数的最小值和正数的最小值。输出时通过判
断负数的最小值是否为0来决定输出,成功实现功能。