鱼C论坛

 找回密码
 立即注册
查看: 158|回复: 3

关于第12章中断程序的疑惑

[复制链接]
发表于 2025-3-12 16:57:52 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 laocaiye 于 2025-3-12 18:13 编辑

在第12章的中断程序例子中,do0处的开始代码是这样的:

        mov ax, cs
              mov ds, ax
              mov si, 202h

这里有个疑问,首先do0-do0end这段代码是存放在0000:00200处的
即端地址是0.这里为何不直接: mov ax,0 。直接把0段给ds不更容易理解吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2025-3-12 16:59:08 | 显示全部楼层
在这个中断程序的例子中,`mov ax, cs` 然后 `mov ds, ax` 这样的写法是为了确保 `ds` 段寄存器与 `cs` 段寄存器保持一致。这种方式的好处是无论代码被加载到哪个段地址,都能正确设置 `ds`,保证数据访问的正确性。

如果直接使用 `mov ax, 0`,那么 `ds` 就会被设置为 `0` 段,这在某些情况下可能会导致数据访问错误,特别是当代码被加载到非 `0` 段时。因此,使用 `mov ax, cs` 这种方式更加通用,适用于代码可能被加载到不同内存地址的情况。

如果你确定代码始终会被加载到 `0000:0200` 处,并且 `cs` 确实是 `0`,那么 `mov ax, 0` 也是可以的。但通常,为了代码的可移植性和健壮性,使用 `mov ax, cs` 是更好的选择。

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

使用道具 举报

 楼主| 发表于 2025-3-12 17:19:06 | 显示全部楼层
为了可移植性和健壮性我知道,但是我不理解的是:整个示例程序是为了在地址0000:200处生成中断处理程序。当示例程序退出后,0000:200处的代码应该是独立的中断处理程序,按理说,示例中的cs和这个独立程序无关了。
是不是 “mov ax,cs” 这条指令在形成中断独立程序过程中作了隐形处理?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-3-12 18:13:32 | 显示全部楼层
我把机器人整不会了,实际上我自己应该明白怎么回事了。既然生成是一段完整的中断代码程序,实际上"mov ax,cs‘’这里的cs本身指向就是这段代码的起始地址,和前面的cs压根就不一回事。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-3-31 09:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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