实验三 输出20之内数的平方值优化
题目:输入一个0到19的数字,输出这个数的平方值spa
要求:1.以十进制输出调试
2.平方值能够事先存放在表单中code
3.输入范围越界要有错误提示索引
4.能够重复输入,直至输入空格为止it
个人思路:把0-19的平方值,放在一段存储区(必定要以字为单位,由于一个字节最大为255),按照0^2,1^2.......19^2的顺序,这样能够方便索引,好比输入5,则其平方值在表单中偏移地址为5*2,这样就能够以 BUF[EBP*2](BUF为表单首地址,EBP为输入的数值)寻址获得相应的平方值。而后的问题就是,咱们以十号调用输入的为一个个字符,这样就要想办法把这一串数字符转换为十进制数,能够讲每一个数字字符减去30H转换为数字而后求加权和(即乘十循环),存起来放到EBP,最后一个问题就是将在表单中索引到的十进制平方值,除10去余存放到一个指定的存储区,注意倒着存储,即先获得的余数在存储区下面。最后将此存储区内的内容输出便可。固然这中间的会遇到不少细节的问题,须要耐心调试,精心分析。作好基本符合要求的程序后,最后稍加优化,在细节上加以改进便可,固然也能够本身再添加一些功能。class
另外一种思路是,将平方值以字符的形式存放到表单中,这样知道输入的数值后能够直接在表单中查找到输出,不须要取余转化,可是我的感受前一种思路更可以锻炼本身的汇编能力。变量
;功能:输入一个0~19的整数,输出其平方值 ;做者:KDF5000 ;时间:2012.11.9 .386 DATA SEGMENT USE16 SQUARE DW 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361 ;存入0~19的平方值便于查询 INPUT DB 8 DB ? DB 8 DUP('$') ;次缓冲区用于存放输入的值 DB 5 DUP('$') OUTPUT DB '$' ;此区存放平方值的输出 ERROR DB '请输入一个0-19范围的数!$' MESSAGE DB '请输入0-19范围的数:$' RESULT DB 0DH,0AH,' 其平方值为:$' EXITMES DB 0DH,0AH,'谢谢你的使用!',0DH,0AH,'$' HUANHANG DB 0DH,0AH,'$' DATA ENDS STACK SEGMENT USE16 STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT USE16 ASSUME DS:DATA,CS:CODE,SS:STACK BEGIN: MOV AX,DATA MOV DS,AX ;输出提示信息 LEA DX,MESSAGE MOV AH,9 INT 21H ; 输入数值 LEA DX,INPUT MOV AH,10 INT 21H ;若是输入空格则推出程序 MOV AL,INPUT+2 CMP AL,20H JE EXIT ;取出输入的数值 LEA SI,INPUT+2 MOV AX,0 MOV BL,10 MOV CL,INPUT+1 ;记录循环的次数 ;将输入的值放到AX LOPA: MOV DL,[SI] DEC CL SUB DL,30H MUL BL ADD AX,DX INC SI CMP CL,0 JE NEXT JMP LOPA NEXT: ;若是输入的数字大于十九或者小于小于0报错 CMP AX,19 JG ERROR1 CMP AX,0 JB ERROR1 MOV BP,AX ;将输入的数据做为变量 MOV AX,SQUARE[EBP*2] ;此时AX存放平方值 MOV CL,10 ;设置除数 MOV SI,OFFSET OUTPUT LOPB: ;次循环为把已经存入的平方值转换为十进值输出 DEC SI DIV CL ADD AH,30H MOV [SI],AH MOV AH,0 CMP AL,0 JNE LOPB ;输出结果提示 LEA DX,RESULT MOV AH,9 INT 21H ;输出十进制平方值 MOV DX,SI MOV AH,9 INT 21H ;输出换行 LEA DX,HUANHANG MOV AH,9 INT 21H ;跳到开始继续输入 JMP BEGIN ERROR1: LEA DX,HUANHANG MOV AH,9 INT 21H LEA DX,ERROR MOV AH,9 INT 21H LEA DX,HUANHANG MOV AH,9 INT 21H JMP BEGIN EXIT: LEA DX,EXITMES ;输出退出信息 MOV AH,9 INT 21H MOV AH,4CH INT 21H CODE ENDS END BEGIN