鱼C论坛

 找回密码
 立即注册
查看: 71|回复: 2

[已解决]关于5h系统调用的问题

[复制链接]
发表于 5 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下面这段代码想测试下使用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:[DI],'$'
        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
最佳答案
5 天前
关于5h系统调用导致 DOSBox 退出的问题解析

你提到的代码中使用了 int 21hAH=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:[DI],'$'

否则你只是把 '$' 存到了 ES 段的偏移 0 处,可能会破坏数据。

总结

  • AH=5h 是读取打印机字符,不适合用于屏幕输出。
  • DOSBox 不支持该调用,可能会直接崩溃。
  • 删除该调用即可解决问题。
  • 注意字符串结尾的 '$' 应该放在正确位置。


如有更多汇编相关问题,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层
什么情况,怎么那么乱啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层    本楼为最佳答案   
关于5h系统调用导致 DOSBox 退出的问题解析

你提到的代码中使用了 int 21hAH=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:[DI],'$'

否则你只是把 '$' 存到了 ES 段的偏移 0 处,可能会破坏数据。

总结

  • AH=5h 是读取打印机字符,不适合用于屏幕输出。
  • DOSBox 不支持该调用,可能会直接崩溃。
  • 删除该调用即可解决问题。
  • 注意字符串结尾的 '$' 应该放在正确位置。


如有更多汇编相关问题,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-2 02:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表