我正在尝试为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
它应该只是真正快速显示一个像素并返回到文本模式,但它会冻结并且不会返回文本。
问题是你使用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