|
|
#3
3037709572006-12-15 23:29
我是用另一种方法做的,没有楼上的大哥编的好,还请多多指教! ;*********************程序说明***************************** ;用汇编编一个程序: ;在数据区定义10条不同信息,编号分别为0~9,每条信息包含30个字符, ;要求从键盘接收0~9之间的数字,然后显示对应编号的内容. ;如:编号为8的信息内容是"012345678901234567890123456789" ;在键盘输入8后就在屏幕显示:012345678901234567890123456789 ;********************************************************* NAME DTRING TITLE TEXT ;********************************************************* DATA SEGMENT MSG DB 0AH,0DH,'012345678901234567890123456789' DB 0AH,0DH,'112345678901234567890123456781' DB 0AH,0DH,'212345678901234567890123456782' DB 0AH,0DH,'312345678901234567890123456783' DB 0AH,0DH,'412345678901234567890123456784' DB 0AH,0DH,'512345678901234567890123456785' DB 0AH,0DH,'612345678901234567890123456786' DB 0AH,0DH,'712345678901234567890123456787' DB 0AH,0DH,'812345678901234567890123456788' DB 0AH,0DH,'912345678901234567890123456789' STR1 DB 'Please Input a number (0-9):$' STR2 DB 0AH,0DH,'Press any key to continue...$' STR3 DB 0AH,0DH,'The number you enter is wrong number!$' NUM DB ?;用来存放你输入的数字 DK DB 32;因为0AH,0DH,'112345678901234567890123456781'的长度是32字节 DATA ENDS ;*********************************************** STACK1 SEGMENT PARA STACK DB 10H DUP(0) STACK1 ENDS ;*********************************************** CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 ;*********************************************** ;以下是主程序入口 ;*********************************************** MAIN PROC FAR START:PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX CALL OUTPUTSTR1;调用OUTPUTSTR1输出提示信息同时接收输入的数字 ;并判断数字的合法性 CALL TURN ;调用TURN将MSG的信息按照要求输出 CALL OUTPUTSTR2;调用OUTPUTSTR2输出Press any key to continue... CALL EXIT ;程序结束返回dos状态 RET MAIN ENDP ;*********************************************** ; 5个子程序OUTPUTSTR1,OUTPUTSTR2, ; OUTPUTSTR3,TURN,EXIT的定义如下: ;*********************************************** ; 1.子程序OUTPUTSTR1的定义 ;功能:在屏幕上输出字符串STR1 ;提示信息:Please Input a number (0-9): ;*********************************************** OUTPUTSTR1 PROC MOV DX,OFFSET STR1 MOV AH,09H;输出字符串STR1 INT 21H ;*********************************************** ;以下是暂停接收用户输入的一个数字(0<=数字<=9) ;*********************************************** MOV AH,01H;暂停接收一个数字 INT 21H ;*********************************************** ;以下是处理输入数字的合法性 ;*********************************************** SUB AL,30H;将ASCII码转换为数字 CMP AL,0 ;和0比较结果不保存只影响标志位 JB LQ ;若AL<0,不合法则跳转到LQ CMP AL,9 ;和9比较结果不保存只影响标志位 JA LQ ;若AL>9,不合法则跳转到LQ MOV NUM,AL;若输入数字合法则存入变量NUM中并跳转到LKP1处 JMP LKP1 LQ: CALL OUTPUTSTR3 ;输出The number you enter is wrong number! CALL OUTPUTSTR2 ;输出Press any key to continue... CALL EXIT ; 程序结束返回dos状态 LKP1: RET OUTPUTSTR1 ENDP ;*********************************************** ; 2.子程序OUTPUTSTR2的定义 ;功能:在屏幕上输出字符串STR2 ;提示信息:Press any key to continue... ;*********************************************** OUTPUTSTR2 PROC MOV DX,OFFSET STR2 ; MOV AH,09H;输出字符串STR2 INT 21H MOV AH,08H;暂停接收一个字符并不显示该字符 INT 21H RET OUTPUTSTR2 ENDP ;*********************************************** ; 3.子程序OUTPUTSTR3的定义 ;功能:在屏幕上输出字符串STR3 ;提示信息:The number you enter is Wrong number! ;*********************************************** OUTPUTSTR3 PROC MOV DX,OFFSET STR3; MOV AH,09H;输出字符串STR3 INT 21H RET OUTPUTSTR3 ENDP ;*********************************************** ; 4.子程序TURN的定义 ;功能:将num的值转化为相对于msg中的偏移量并存入BL中 ;*********************************************** TURN PROC XOR BX,BX ;将BX清零 MOV BL,NUM;BL<-NUM MOV AL,BL ;将BL中的值NUM保存到AL中相当于AL=NUM MUL DK ;将AL中的值NUM乘32相当于AL=32*NUM MOV BL,AL ;将AL中的值32*NUM保存到AL中相当于AL=32*NUM MOV BH,AH ;注意:这一句不能少,因为0<=32*num<=288, ;AL已经不能存放这么大的数了 MOV CX,30 ;将CX中赋值为30为下面的LOOP循环作准备 ;因为要输出的是30位数字 ;*********************************************** ;以下是输出msg+BX中的字符如:若num=1即bx=1 ;则输出回车和112345678901234567890123456781 ;*********************************************** LOP: MOV DL,MSG[BX] MOV AH,02H;输出DL中的内容 INT 21H INC BX LOOP LOP RET TURN ENDP ;*********************************************** ; 5.子程序EXIT的定义 ;功能:退出程序返回DOS ;*********************************************** EXIT PROC MOV AH,4CH;退出程序返回dos INT 21H RET EXIT ENDP CODE ENDS END START ;************************************************ ;我已经尽量给出了注释希望大家能看懂! ;************************************************
|