laocaiye 发表于 7 天前

关于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

laocaiye 发表于 7 天前

什么情况,怎么那么乱啊

FishC 发表于 7 天前

关于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]
查看完整版本: 关于5h系统调用的问题