2013-03-01 93 views
1

我試圖做一個小程序,它接受4位數字。但由於某種原因,進入第四位數後不會停止。爲什麼我的ASM(使用Turbo Assembler)程序無限循環?

這是我正在使用的概念。

例如1234四位數字簡直是 「1000 + 200 + 30 + 4」
所以,當我在程序中輸入1234,這是發生了什麼:

1 BX = 0000 0000 0000 0000  

2.1 BX = BX + 1000  

3.1 BX = BX + 100 
3.2 BX = BX + 100 

4.1 BX = BX + 10 
4.2 BX = BX + 10 
4.3 BX = BX + 10  

5.1 BX = BX + 1 
5.2 BX = BX + 1 
5.3 BX = BX + 1 
5.4 BX = BX + 1  

所以BX = 0000 0000 0000 1234
但下面的程序進入無限循環。有人可以幫我解決這個問題。

;===========MACROS========== 
;-----INPUT MACROS 
INPUT_BCD_SUB MACRO DIGIT 
     CALL COMMON_INP_PROC   
     MOV DIGIT_PLACE, DIGIT 
     CALL NUM_CONVERTOR 
ENDM 

INPUT_BCD MACRO VAR 
     XOR BX,BX 
     SHOW T_MSG2 
     INPUT_BCD_SUB 1000 
     INPUT_BCD_SUB 0100 
     INPUT_BCD_SUB 0010 
     INPUT_BCD_SUB 0001 
     MOV VAR, BX 
     XOR BX,BX 
ENDM 

;-----SHOW MACRO 
SHOW MACRO MSG 
     MOV AH, 09H 
     LEA DX, MSG 
     INT 21H 
ENDM 
;-----END: SHOW MACRO 

;-----KILLME MACRO 
KILLME MACRO 
     MOV AH, 4CH 
     INT 21H 
ENDM 
;-----END: KILLME MACRO 

.MODEL SMALL 
.DATA 
     T_MSG1 DB 10,13,'Enter a number: $' 
     T_MSG2 DB 10,13,'You have entered: $' 
     ERR_MSG DB 10,13, 'An error has occured: Invalid digit entered. Please use  digits 0 to 9 $' 
     VAR_NUM1 DW 1 DUP(0) 
     DIGIT_PLACE DW 1 DUP(0) 
.CODE   

    COMMON_INP_PROC PROC 
     MOV AH, 01H 
     INT 21H 
     CMP AL, 30H 
      JB ERR1 
     CMP AL, 39H 
     JBE SUBT_30 
     ERR1: SHOW ERR_MSG 
       KILLME 
     SUBT_30: SUB AL, 30   
     RET 
COMMON_INP_PROC ENDP 

NUM_CONVERTOR PROC 
     MOV CL,AL 
     COUNT: ADD BX, DIGIT_PLACE     
     LOOP COUNT  
NUM_CONVERTOR ENDP 

MAIN PROC 
     MOV AX, @DATA 
     MOV DS, AX 

     SHOW T_MSG1 
     INPUT_BCD VAR_NUM1 
     KILLME 
MAIN ENDP 
END MAIN 

我也生成了一個列表文件,它看起來很好。我真的不知道是什麼問題...

List file generated by TASM

+1

不應該'NUM_CONVERTOR'最後有一個'RET'嗎? (我不記得是否'ENDP'自動插入一個) – Michael 2013-03-01 17:41:49

+2

此代碼的另一個潛在問題是,在'NUM_CONVERTOR'中使用'LOOP'之前似乎沒有清除'CH'。 「LOOP」指令將「CX」分開,而不僅僅是低8位(「CL」)。 – Michael 2013-03-01 17:47:35

+0

謝謝你的回覆。它的午夜在這裏,所以我明天將修復代碼並在這裏報告。 :) – Abhinav 2013-03-01 18:30:58

回答

0

事實上,NUM_CONVERTER沒有一個RET會產生循環,CH是也從未初始化,兩者都是正確的。單步建議也很有用。我將此發佈爲答案,以便您可以關閉此問題,以便它不再顯示在SO網站上。