在JMP命令之后,程序不会返回到它被调用的位置

问题描述 投票:1回答:1

我正在尝试为DOSBOX编写一个简单的图形引擎,而且进展相当顺利,我一直在使用https://github.com/adamsmasher/sokobanDOS/的一些代码 我的问题是,在我调用JMP命令去绘制pix后,程序没有返回main,至少我认为它没有。在绘制像素后,它应该返回到我自己测试的文本并且它可以工作。 我是新成员,所以我真的不知道自己在做什么。

jmp initgraph

main:
    MOV CX, 320
    JMP drawpixel
    JMP returntext
    JMP main

initgraph:
    MOV AX, 13h
    INT 10h
    MOV CX, 0
    JMP main

returntext:
    MOV AX, 0x03
    INT 0x10
    RET

drawpixel:
    MOV AX, 0A000h
    MOV ES, AX
    MOV AX, CX
    MOV DI, AX
    MOV DL, 0xE
    MOV [ES:DI], DL

它应该只是真正快速显示一个像素并返回到文本模式,但它会冻结并且不会返回文本。

assembly nasm
1个回答
2
投票

问题是你使用JMP而不是CALL

当您使用JMP(或其任何条件变体)时,您指示CPU将当前指令指针替换为使用操作数编码的立即或计算值。没有规定跟踪你的位置。

当您使用CALL操作时,以下操作码的地址被压入堆栈,SP按适当的堆栈宽度递减,并且调用中的立即/计算值被放入指令指针。这允许您使用RET指令返回上一个执行位置。

使用CALL的示例代码,进入图形模式,绘制像素,等待键,返回文本模式,然后退出到DOS可能看起来像:

org 100h

main:
    CALL initgraph
    MOV CX, 320
    CALL drawpixel
    CALL waitforkey
    CALL returntext

    MOV AX, 4C00h               ; Exit to DOS returning exit code 00h
    INT 21h

waitforkey:
    MOV AH, 0                   ; Int 16h/AH=0 get key BIOS call
    INT 16h
    RET

initgraph:
    MOV AX, 13h
    INT 10h
    MOV CX, 0
    RET

returntext:
    MOV AX, 0x03
    INT 0x10
    RET

drawpixel:
    MOV AX, 0A000h
    MOV ES, AX
    MOV AX, CX
    MOV DI, AX
    MOV DL, 0xE
    MOV [ES:DI], DL
    RET
© www.soinside.com 2019 - 2024. All rights reserved.