2013-03-01 2 views
1

Я попытался сделать небольшую программу, которая принимает 4-значное число. Но по какой-то причине он не останавливается после ввода 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

+2

Другая потенциальная проблема с этим кодом заключается в том, что вы, кажется, не очищаете 'CH' до использования' LOOP' в 'NUM_CONVERTOR'. Инструкция 'LOOP' выдает' CX', а не только младшие 8 бит ('CL'). – Michael

+0

Благодарим вас за ответ. Здесь полночь, поэтому завтра я исправлю код и отчитаюсь здесь. :) – Abhinav

ответ

0

Действительно, NUM_CONVERTER не имея RET будет производить цикл, и CH никогда не инициализирован либо оба были правы. Совет к одноэтапному также звучит. Я отправляю это как ответ, поэтому вы можете закрыть эту проблему, чтобы она больше не отображалась на SO-сайте.