【问题标题】:Why is my ASM (using Turbo Assembler) program looping infinitely?为什么我的 ASM(使用 Turbo Assembler)程序无限循环?
【发布时间】:2013-03-01 16:57:28
【问题描述】:

我尝试制作一个接受 4 位数字的小程序。但由于某种原因,它在输入第 4 位后并没有停止。

这是我正在使用的概念。

四位数字(例如 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

【问题讨论】:

  • NUM_CONVERTOR 最后不应该有一个RET 吗? (不记得ENDP是否自动插入)
  • 此代码的另一个潜在问题是,在NUM_CONVERTOR 中使用LOOP 之前,您似乎没有清除CHLOOP 指令递减 CX,而不仅仅是低 8 位 (CL)。
  • 感谢您的回复。这里是午夜,所以我明天将修复代码并在这里报告。 :)
  • 另外,使用调试器单步调试您的代码,看看它在哪里没有达到您的预期。

标签: loops assembly infinite tasm


【解决方案1】:

确实,没有 RET 的 NUM_CONVERTER 会产生循环,并且 CH 也永远不会初始化,两者都是正确的。单步的建议也是合理的。我将此作为答案发布,以便您可以关闭此问题,使其不再出现在 SO 网站上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-10
    • 2023-03-22
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多