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
我也生成了一個列表文件,它看起來很好。我真的不知道是什麼問題...
不應該'NUM_CONVERTOR'最後有一個'RET'嗎? (我不記得是否'ENDP'自動插入一個) – Michael 2013-03-01 17:41:49
此代碼的另一個潛在問題是,在'NUM_CONVERTOR'中使用'LOOP'之前似乎沒有清除'CH'。 「LOOP」指令將「CX」分開,而不僅僅是低8位(「CL」)。 – Michael 2013-03-01 17:47:35
謝謝你的回覆。它的午夜在這裏,所以我明天將修復代碼並在這裏報告。 :) – Abhinav 2013-03-01 18:30:58