assembly - 如何在 16 位汇编程序中传递/检索 DOS 命令行参数?

标签 assembly dos tasm 16-bit x86-16

我正在为 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 版本可免费在线获取(HTMLPDF 格式)。在 Chapter 13 ,第 13.3.11 节介绍了 PSP,接下来的两节 (13.3.12–13) 解释了如何访问和解析命令行参数,包括示例代码。

关于assembly - 如何在 16 位汇编程序中传递/检索 DOS 命令行参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41448788/

相关文章:

assembly - TASM 中的 "Near jump or call to different CS"错误

arrays - ARM 汇编数组

c++ - 从 MCInsts (x86) 获取 "actual"寄存器

assembly - x86中 "lock"在arm汇编中对应的前缀是什么?

linux - 将DOS程序移植到linux上通过usb读写串口

cross-compiling - 带有 Open Watcom 的 COM 可执行文件

assembly - (本地)标签如何在其自己的段(TASM 8086)之外结束?

linux - x86-64 汇编代码未运行

assembly - 如何在DOS汇编中从键盘读取字符并将其保存到文件中?

assembly - Tasm 宏默认值