You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:15:42