我正在为 MS-DOS 编写一些小工具。现在我正在编写一个 Shutdown.com
,类似于 Windows XP 及更高版本。我已经编写了整个代码,现在我只需要从 DOS 传递参数即可。
我需要传递参数“-r”来重新启动,“-s”来关闭。
我该怎么做?
我在Windows 98上使用TASM(Turbo Assembler 4.1)来链接和编译。我正在寻找一种非常简单的方法来做到这一点,如果可能的话,仍然是一个 .COM
程序。我看起来与 C 语言中的 ARGV 和 ARGC 完全相同,但对于汇编 16 位...
shutdown -r
将重新启动shutdown -s
将关闭
请记住,我已经知道如何重新启动以及如何关闭电脑。
我只需要学习如何将参数从 MS-DOS 命令行传递到我的程序。
最佳答案
没有特定的 API 可以检索 MS-DOS 中的命令行。相反,您必须从 Program Segment Prefix (PSP) 的适当偏移量读取值。 ,这是 DOS 用于存储程序特定数据的数据结构。
在偏移量 80h 处,有一个 1 字节的值,它给出了命令行参数的长度。实际的命令行参数字符串从偏移量 81h 开始,长度最多可达 127 个字节。您可以根据偏移量 80h 处的值知道它有多长,但它也会以回车符 (0Dh) 终止。
当程序首次执行时,您可以使用相对于 DS 寄存器中指针的这些偏移量。否则,您可以调用 INT 21h
,并将 AH
设置为 62h
,以检索指向 BX
中当前 PSP 的指针登记。 (函数 62h
需要 DOS 3 或更高版本;在 DOS 2 上,您可以使用未记录的函数 51h
)。
Randall Hyde 的《Art of Assembly》旧版 16 位 DOS 版本可免费在线获取(HTML 和 PDF 格式)。在 Chapter 13 ,第 13.3.11 节介绍了 PSP,接下来的两节 (13.3.12–13) 解释了如何访问和解析命令行参数,包括示例代码。
关于assembly - 如何在 16 位汇编程序中传递/检索 DOS 命令行参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41448788/