彙編實驗(輸入一個數輸出其平方值)

實驗三 輸出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
相關文章
相關標籤/搜索