【问题标题】:Intel 8086, infinite loopIntel 8086,无限循环
【发布时间】:2018-07-15 19:17:02
【问题描述】:

我正在尝试编写一个小应用程序,其中使用系统时钟生成 1-5 之间的随机数,用户必须猜测该数字,如果猜测正确,则会显示一条消息。

到目前为止,这是我的代码:

org 0x100


;Guess:
        MOV AH,2CH  ;DOS CALL TO GET SYSTEM CLOCK
        INT 21H     ;EXECUTE INTERRUPT 21H
        MOV AL,DL   ;RESULT RETURNED IN DL
        MOV AH,0    ;CLEAR THE HIGH BYTE
        MOV CL,20   ;GET DIVISOR
        DIV CL      ;DIVIDE VALUE IN AX BY VALUE IN CL
        MOV BL,AL   ;MOVE RESULT OF DIVISION INTO BL
        INC BL      ;INCREMENT BL TO GET NO BETWEEN 1-5

;Prompt:
        JMP START
        MSG DB "Enter a number between 1-5:$"

        START:  

        MOV DX, OFFSET MSG
        MOV AH, 09h 
        INT 21h

;User input:

        MOV AH, 1h  ;GET INPUT FROM THE KEYBOARD 
        INT 21h     ;THE CHARACTER INPUT IS STORED IN AL

;The Comparison: 

        ;MOV AX,AL   ;LOAD VALUE OF AL (USER INPUT)
        CMP AL,BL   ;COMPARE WITH BL

        JE Equal    ;IF EQUAL JUMP TO Equal
        JNE Not_Equal;IF NOT EQUAL JUMP TO Not_Equal        

        Equal:

        ABC DB "Your guess was correct!$"
        MOV DX, OFFSET ABC
        MOV AH, 09h 
        INT 21h        


        Not_Equal:

        DEF DB "Your guess was incorrect!$"
        MOV DX, OFFSET DEF
        MOV AH, 09h 
        INT 21h

我的问题是它进入了一个无限循环。

【问题讨论】:

  • 您正在寻找条件跳转。 jejzjg
  • JE Equal ;IF EQUAL JUMP TO Equal JNE Not_Equal;IF NOT EQUAL JUMP TO Not_Equal

标签: assembly x86-16


【解决方案1】:

您的代码中存在一些不同的问题:

你不能像这样混合代码和数据:

    ABC DB "Your guess was correct!$"
    MOV DX, OFFSET ABC

CPU 无法区分代码和数据,它会尝试执行它遇到的任何内容。将结果字符串移动到您获得 MSG 字符串的同一位置。


您正在将数值与其对应的 ASCII 字符进行比较:

    MOV AH, 1h  ;GET INPUT FROM THE KEYBOARD 
    INT 21h     ;THE CHARACTER INPUT IS STORED IN AL

如果您在终端中输入数字2,您将在AL 中获得字符'2'(等于50)。要成功地将它与您在 BL 中得到的结果进行比较,您必须从 AL 中减去 '0'


您将始终打印“您的猜测不正确”字符串。在打印“你的猜测是正确的”字符串的代码之后,没有跳转跳过下一个打印:

    ABC DB "Your guess was correct!$"
    MOV DX, OFFSET ABC
    MOV AH, 09h 
    INT 21h        

    ; Execution will simply continue here since there's nothing that changes the
    ; flow of execution.

    Not_Equal:

您没有正确终止程序。在您的程序结束时,您应该添加如下内容:

MOV AX,4C00h
INT 21h    ; Terminate with exit code 00h

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    相关资源
    最近更新 更多