2013-03-01 3 views
1

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 

또한 목록 파일을 생성 했으므로 잘 보입니다. 정말 모두 정확했다 ... 사실

List file generated by TASM

+1

'NUM_CONVERTOR'끝에 'RET'을 넣지 않아야합니까? (나는'ENDP'가 자동적으로 하나를 삽입하는지 기억할 수 없다.) – Michael

+2

이 코드의 또 다른 잠재적 인 문제점은'NUM_CONVERTOR'에서'LOOP'를 사용하기 전에'CH'를 지우지 않는 것입니다. 'LOOP' 명령은 하위 8 비트 ('CL')뿐만 아니라'CX'를 디코딩합니다. – Michael

+0

답장을 보내 주셔서 감사합니다. 그것의 자정은 여기에 그래서 나는 내일 코드를 고치고 여기에보고 할 것이다. :) – Abhinav

답변

0

, 문제가 무엇인지 모르는 NUM_CONVERTER RET를 갖는 루프를 생성하지 않습니다, 및 CH 중 하나 초기화되지 않습니다. 단일 단계에 대한 조언은 또한 건전합니다. 나는이 문제를 해결할 수 있도록 SO 사이트에 더 이상 나타나지 않도록 답변으로 게시하고 있습니다.