MS-DOS汇编编程疑问:RE_INIT标签应置于SKELIO.ASM还是SYSINIT.ASM?
关于RE_INIT标记位置与操作的清晰解答
我来帮你理清这个问题,针对你提到的BIOS回调适配和RE_INIT标记的困惑,结合模块分工和操作逻辑拆解说明:
核心要求回顾
需将BIOS链接以适配SYSINIT末尾的BIOS回调;若无需该回调,只需找到一条far RET并标记为RE_INIT且声明为public。
一、无需BIOS回调:标记RE_INIT的正确姿势
不管是在SKELIO.ASM还是SYSINIT.ASM里,核心是找一条未被其他业务逻辑占用的far RET指令,优先推荐在SYSINIT.ASM操作——毕竟SYSINIT是负责系统初始化的模块,和初始化收尾的返回逻辑更匹配,不会干扰SKELIO的IO骨架功能。具体步骤如下:
定位合适的far RET
- 先看
SYSINIT.ASM:找到原本用于BIOS回调返回的那条far RET(通常在模块末尾附近),如果不需要回调,这条就是最理想的目标,它本来就属于初始化流程的收尾环节。 - 如果SYSINIT里没有合适的,再去
SKELIO.ASM找:挑选那些属于初始化收尾、不涉及IO读写功能的far RET,确保标记后不会破坏原有IO流程的完整性。
- 先看
添加RE_INIT标签并声明public
找到目标far RET后,在它紧挨着的上方加上标签,然后声明为public,示例代码如下:public RE_INIT RE_INIT: retf ; 这里就是你找到的far RET指令注意:标签必须直接放在far RET的上一行,不能夹着其他执行指令,否则跳转过来后会先执行多余代码,导致逻辑出错。
二、需要BIOS回调:适配SYSINIT的BIOS链接
如果需要保留BIOS回调功能,你不需要标记RE_INIT,而是要修改SYSINIT末尾的回调逻辑,把它正确链接到目标BIOS函数的入口地址。一般是用call far或jmp far指令,指定BIOS函数的段地址和偏移地址,比如:
; 示例:跳转到BIOS的某一功能入口 jmp far [BIOS_FUNCTION_ENTRY]
确保这个链接地址和你要调用的BIOS功能匹配即可。
额外建议
如果拿不准选哪个文件,优先遵循模块分工原则:初始化相关的逻辑放在SYSINIT.ASM里,IO相关的放在SKELIO.ASM里,这样后续维护起来会更清晰。
内容的提问来源于stack exchange,提问作者vijaydidmca1




