关于5h系统调用的问题
下面这段代码想测试下使用5h系统调用打印一个字符串,但是当运行到该功能调用时,DOSBOX直接关闭退出了。请教什么原因?ASSUME CS:CODE,DS:DATA1,ES:DATA2
DATA1 SEGMENT
S1 DB 'ABCDEFGHIJKLMNOPQISTUVWXYZ'
CPUNT EQU $-OFFSET S1
DATA1 ENDS
DATA2 SEGMENT
S2 DB 27 DUP (?)
DATA2 ENDS
CODE SEGMENT
START:MOV AX,DATA1
MOV DS,AX
MOV AX,DATA2
MOV ES,AX
MOV SI,OFFSET S1
MOV DI,OFFSET S2
MOV CX,CPUNT
CLD
REP MOVSB
MOV BYTE PTR ES:,'$'
MOV DX,OFFSET S2
MOV AX,ES
MOV DS,AX
MOV AH,9H
INT 21H
mov ah,5h
int 21h
MOV AH,4CH
INT 21H
CODE ENDS
END START 什么情况,怎么那么乱啊 关于5h系统调用导致 DOSBox 退出的问题解析
你提到的代码中使用了 int 21h 的 AH=5h 功能号,这正是导致 DOSBox 直接关闭的原因。我们来详细分析一下。
1. AH=5h 的作用
AH=5h 是 DOS 的一个系统调用,用于从标准输出设备读取一个字符(通常是打印机)。其功能是:
AH = 05h
INT 21h
返回:AL = 读取的字符
注意:这个调用是从标准输出设备(通常是 LPT1)读取字符,而不是从键盘或屏幕。
2. 为什么会导致 DOSBox 退出?
在 DOSBox 中,标准输出设备(LPT1)并没有被正确模拟,所以当你调用 AH=5h 时,DOSBox 可能会因为无法处理这个调用而崩溃或直接退出。
3. 正确的做法
如果你只是想打印字符串,使用 AH=9h 就足够了,不需要调用 AH=5h。你可以安全地删除以下两行:
mov ah,5h
int 21h
4. 额外建议
另外,你的这行代码:
MOV BYTE PTR ES:,'$'
是有问题的。你应该指定具体的地址,比如:
MOV BYTE PTR ES:,'$'
否则你只是把 '$' 存到了 ES 段的偏移 0 处,可能会破坏数据。
总结
[*]AH=5h 是读取打印机字符,不适合用于屏幕输出。
[*]DOSBox 不支持该调用,可能会直接崩溃。
[*]删除该调用即可解决问题。
[*]注意字符串结尾的 '$' 应该放在正确位置。
如有更多汇编相关问题,欢迎继续提问!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]