4 자리 숫자를 허용하는 작은 프로그램을 만들려고했습니다. 그러나 어떤 이유로 4 번째 자리를 입력 한 후에도 멈추지 않습니다.왜 ASM (Turbo Assembler 사용) 프로그램이 무한 루프 되나요?
이것은 내가 사용하고있는 개념입니다. = 0000 0000 0000
그래서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를 :
예를 1234에 대한 네 자리 숫자는 내 프로그램에 1234을 입력 할 때
그래서 이런 것입니다 "1000 + 200 + 30 + 4"단순히 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
이 코드의 또 다른 잠재적 인 문제점은'NUM_CONVERTOR'에서'LOOP'를 사용하기 전에'CH'를 지우지 않는 것입니다. 'LOOP' 명령은 하위 8 비트 ('CL')뿐만 아니라'CX'를 디코딩합니다. – Michael
답장을 보내 주셔서 감사합니다. 그것의 자정은 여기에 그래서 나는 내일 코드를 고치고 여기에보고 할 것이다. :) – Abhinav