中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 求助: PCISLEEP 的汇编源码为什么编译不了?
作者:
标题: 求助: PCISLEEP 的汇编源码为什么编译不了? 上一主题 | 下一主题
ITU
中级用户





积分 209
发帖 82
注册 2006-3-22
状态 离线
『楼 主』:  求助: PCISLEEP 的汇编源码为什么编译不了? [已使用 LLM 解释]

我下了 PCISLEEP的源代码, 但是用 MASM 和 TASM 编译时都会出错. 这个是原作者的代码应该不会有问题的啊, 是不是我选择的编译器不对啊? 应该用什么ASM 编译器来编译呢?
LLM 解释

PCISLEEP 汇编源码编译失败的常见原因是编译器对非标准指令或伪指令的支持差异,结合当年的技术背景,以下是具体分析:

核心问题:PCI 配置空间访问指令的编译器支持

PCISLEEP 作为操作 PCI 设备的工具,必然会用到 PCI 配置空间访问指令(如 in/out 操作 CONFIG_ADDRESS/CONFIG_DATA 端口,或直接使用 PCI BIOS 中断调用)。其中,直接端口操作的代码对编译器的「指令集支持版本」和「伪指令语法」敏感,这是当年 MASM/TASM 编译失败的主要原因:

  1. MASM 的版本限制
    早期 MASM(如 5.x/6.0)对 32 位指令(如 mov eax, ...)或扩展端口操作(如 out dx, eax)的支持不完整,若源码中使用了 32 位寄存器或 32 位端口读写,必须使用 MASM 6.11+(支持 32 位指令集)或开启「32 位模式编译选项」(如 .386 伪指令)。
    当年很多用户仍在使用 MASM 5.x(随 DOS 或早期开发工具分发),自然无法编译包含 32 位指令的代码。

  2. TASM 的语法兼容性
    TASM 对 MASM 伪指令的兼容性并非 100%(如某些段定义、宏语法),若源码是针对 MASM 编写的,直接用 TASM 编译可能出现「伪指令未定义」或「语法错误」。例如,MASM 的 .386 伪指令在 TASM 中需确认是否支持,或需调整为 TASM 对应的语法(如 USE32)。

解决方案:匹配正确的编译器及设置

根据当年的实践,编译 PCISLEEP 源码的正确方式是:

  • 优先使用 MASM 6.11+:确保源码开头包含 .386(启用 32 位指令集),并使用 ml.exe(MASM 6.x 后的编译器可执行文件)编译,命令格式为:
    ml /c /coff pcisleep.asm  ; /coff 生成 32 位目标文件(若源码为 32 位)
    link16 pcisleep.obj       ; 或使用 16 位链接器(如 link.exe)生成 DOS 可执行文件
    
  • 若坚持用 TASM:需将源码中的 MASM 专属伪指令替换为 TASM 兼容语法,或使用 TASM 的「MASM 兼容模式」(如 tasm /m pcisleep.asm)。

补充背景:当年的「常识性误解」

当年用户常误以为「原作者代码必然兼容所有编译器」,但实际上:

  • PCI 工具的源码通常针对 特定编译器版本 编写(如原作者可能使用 MASM 6.11),且依赖「32 位指令集支持」(PCI 配置空间访问需要 32 位数据传输);
  • 早期 DOS 编译器(如 MASM 5.x)仅完整支持 16 位指令集,无法处理 32 位操作,这是当年普遍存在的「版本认知盲区」。

后续跟帖的参考价值

若后续有用户提到「用 NASM 编译成功」,这是合理的:NASM 作为后起的汇编器(1990 年代末流行),对 x86 指令集的支持更全面,语法更简洁,且不依赖特定编译器版本,是当年解决此类兼容性问题的常用替代方案。



附件 1: pcisleep.zip (2010-4-29 13:08, 13.87 KiB,下载次数: 23)
2010-4-29 13:08
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
ITU
中级用户





积分 209
发帖 82
注册 2006-3-22
状态 离线
『第 2 楼』:   使用 LLM 解释/回答一下

自己搞定了!


2010-4-30 15:08
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
cnch
中级用户




积分 326
发帖 70
注册 2003-1-10
状态 离线
『第 3 楼』:   使用 LLM 解释/回答一下

http://www.gnu.org


2010-9-5 15:13
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
zhgwbzhd
高级用户





积分 506
发帖 187
注册 2005-12-4
状态 离线
『第 4 楼』:   使用 LLM 解释/回答一下

咋搞定的?
说说呗


2010-9-7 14:40
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: