汇编实验(输入一个数输出其平方值)

实验三 输出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
相关文章
相关标签/搜索