x86汇编跳转后返回主代码方法及测验程序跳转异常排查
x86汇编测验程序跳转问题解决
问题描述
我是汇编新手,尝试用x86汇编编写一个测验程序:程序显示题目与选项,用户输入答案(1-3),答对则增加总分。但当前完成第一题后会直接显示最终得分消息,跳过后续题目,想了解x86汇编中跳转后如何回到主代码继续执行后续逻辑。
原代码
.stack 100h .data ; ~the offsets here total db 0 mesajfinal db ' intrebari corecte din 4',13,10,'$' .code mov ax,@data mov ds,ax mov ah,9h mov dx,offset m11 int 21h mov ah,9h mov dx,offset m12 int 21h mov ah,9h mov dx,offset m13 int 21h mov ah,9h mov dx,offset m14 int 21h mov ah,1 int 21h mov bl,al cmp bl,'2' je @CORECT jmp @GRESIT ; there i want to continue after jump mov ah,9h mov dx,offset m21 int 21h mov ah,9h mov dx,offset m22 int 21h mov ah,9h mov dx,offset m23 int 21h mov ah,9h mov dx,offset m24 int 21h mov ah,1 int 21h mov bl,al cmp bl,'2' je @CORECT jmp @GRESIT @CORECT: inc total mov ah, 2 mov dl,0ah int 21h mov dl,0dh int 21h @GRESIT: mov ah, 2 mov dl,0ah int 21h mov dl,0dh int 21h mov dl,total add dl,48 mov ah,2 int 21h mov ah,9h mov dx,offset mesajfinal int 21h mov ah,4ch int 21h end
问题原因
当前代码中,第一题判断对错后跳转到@CORECT或@GRESIT,执行完这两个标签的逻辑后,程序会顺着指令流直接向下执行,也就是走到显示总分的代码,根本没机会执行第二题的逻辑。
解决方法
需要在答对/答错的分支结束后,手动添加跳转指令,让程序跳转到下一题的起始位置,而不是直接落到后续的得分代码。具体步骤:
- 给每个题目的代码块开头添加专属标签,比如给第二题开头加
@INTREBARE_2; - 在每个对错分支的末尾添加明确的
jmp指令,指定程序下一步要执行的位置; - 最后一题处理完后,再让程序流自然走到显示总分的逻辑。
修改后的代码示例
.stack 100h .data ; ~the offsets here total db 0 mesajfinal db ' intrebari corecte din 4',13,10,'$' .code mov ax,@data mov ds,ax mov ah,9h ; 第一题处理逻辑 mov dx,offset m11 int 21h mov ah,9h mov dx,offset m12 int 21h mov ah,9h mov dx,offset m13 int 21h mov ah,9h mov dx,offset m14 int 21h mov ah,1 int 21h mov bl,al cmp bl,'2' je @CORECT_1 jmp @GRESIT_1 ; 第二题处理逻辑的标签 @INTREBARE_2: mov ah,9h mov dx,offset m21 int 21h mov ah,9h mov dx,offset m22 int 21h mov ah,9h mov dx,offset m23 int 21h mov ah,9h mov dx,offset m24 int 21h mov ah,1 int 21h mov bl,al cmp bl,'2' je @CORECT_2 jmp @GRESIT_2 ; 第一题答对分支 @CORECT_1: inc total mov ah, 2 mov dl,0ah int 21h mov dl,0dh int 21h jmp @INTREBARE_2 ; 跳转到第二题 ; 第一题答错分支 @GRESIT_1: mov ah, 2 mov dl,0ah int 21h mov dl,0dh int 21h jmp @INTREBARE_2 ; 跳转到第二题 ; 第二题答对分支 @CORECT_2: inc total mov ah, 2 mov dl,0ah int 21h mov dl,0dh int 21h jmp @AFTER_ALL ; 跳转到显示总分的前序位置 ; 第二题答错分支 @GRESIT_2: mov ah, 2 mov dl,0ah int 21h mov dl,0dh int 21h jmp @AFTER_ALL ; 跳转到显示总分的前序位置 ; 显示总分逻辑 @AFTER_ALL: mov dl,total add dl,48 mov ah,2 int 21h mov ah,9h mov dx,offset mesajfinal int 21h mov ah,4ch int 21h end
关键说明
- 给每个对错分支单独命名标签(比如
@CORECT_1、@GRESIT_1),避免不同题目的分支互相干扰; - 通过
jmp指令明确控制流程走向,确保做完一题后能跳转到下一题,所有题目完成后再执行得分显示逻辑; - 如果有第三、第四题,可按同样逻辑扩展:给新题目加标签,在上一题的对错分支末尾跳转到新题目标签,最后一题的分支跳转到显示总分的标签。
内容的提问来源于stack exchange,提问作者P4th0 88
相关产品推荐
相关产品推荐

