WINDOWS 命令行解释器
Microsoft 的 MASM (主要) 是一个从 Windows 命令行使用的工具。因此,要正确使用 MASM (至少对于本书中的所有示例而言),您需要熟练使用 Windows 命令行解释器 (CLI)。
附录 C介绍如何设置 Windows CLI 以便您使用它。本附录简要介绍了您将在 CLI 中使用的一些常用命令。
D.1 命令行语法
基本的 Windows CLI 命令采用以下形式
command options
其中,command是内置 CLI 命令、磁盘上的可执行程序(通常具有.exe文件名后缀)或批处理文件名(具有.bat后缀),而options是该命令的零个或多个选项的列表。这些选项是特定于命令的。
本书中从命令行运行的可执行程序的最常见示例可能是ml64.exe程序(MASM 汇编程序)。Microsoft 链接器 ( link.exe )、库管理器 ( lib.exe )、nmake ( nmake.exe ) 和 MSVC 编译器 ( cl.exe ) 也是可以从命令行运行的可执行程序的示例。
本书中出现的所有示例程序也是可以从命令行运行的命令的示例。例如,以下命令执行build.bat批处理文件来构建listing2-1.exe可执行文件(来自第 2 章):
build listing2-1
构建listing2-1.exe可执行文件后,您可以立即从命令行运行它。以下是命令及其生成的输出:
C:\>listing2-1
Calling Listing 2-1:
i=1, converted to hex=1
j=123, converted to hex=7b
k=456789, converted to hex=6f855
Listing 2-1 terminated
listing2-1.exe可执行文件不支持任何命令行选项。如果您在listing2-1
命令行上的命令后输入任何内容,listing2-1.exe程序将忽略该文本。
尽管大多数选项都是特定于命令的,但您可以将某些命令行选项应用于从命令行运行的大多数程序:具体来说,I/O 重定向。许多控制台应用程序将数据写入标准输出设备(控制台窗口)。例如,本书中出现的所有print
和printf
函数调用都将其数据写入标准输出设备。通常,发送到标准输出设备的所有输出都显示为写入命令行(控制台)窗口的文本。
但是,你可以使用输出重定向选项告诉 Windows 将这些数据发送到文件(甚至另一个设备)。输出重定向选项采用以下形式
command options >filename more_options
其中command是命令名称,options和more_options是零个或多个命令行选项(不包含输出重定向选项),filename是要将命令的输出发送到的文件的名称。考虑以下命令行:
listing2-1 >listing2-1.txt
执行此命令不会在屏幕上产生任何输出。但是,您会发现此命令会在磁盘上创建一个新的文本文件。该文本文件将包含来自listing2-1.exe程序(前面给出)的输出。
Windows CLI 还支持使用语法进行标准输入重定向
command options <filename more_options
其中command是命令名称,options和more_options是零个或多个命令行选项(不包含输入重定向选项),filename是命令将从中读取其输入的文件的名称。
输入重定向使程序从文本文件读取数据,而程序通常从用户那里读取数据(键盘,即标准输入设备)。例如,假设您执行了listing2-1
前面给出的命令,并将输出重定向到listing2-1.txt输出文件。考虑以下命令(来自第 1 章),该命令从用户那里读取一行文本(在此特定示例中,我键入了hello
一行文本以响应程序的输入请求):
C:\>build listing1-8
C:\>echo off
Assembling: listing1-8.asm
c.cpp
C:\>listing1-8
Calling Listing 1-8:
Enter a string: hello
User entered: 'hello'
Listing 1-8 terminated
现在考虑以下命令:
C:\>listing1-8 <listing2-1.txt
Calling Listing 1-8:
Enter a string: User entered: 'Calling Listing 2-1:'
Listing 1-8 terminated
在此示例中,输入是从先前执行listing2-1.exe生成的listing2-1.txt文件重定向而来的。listing1-8.exe程序读取该文件的第一行作为输入(而不是从键盘读取一行文本)。该程序不会回显从文件中读取的文本(包括换行符);这就是文本与提示符出现在同一行的原因。当实际从键盘读取数据时,系统会将数据回显到显示器(包括换行符)。当从文件重定向输入时,不会发生这种情况。User entered: 'Calling Listing 2-1:'Enter a string:
该文件包含多行文本。但是,listing1-8.exe仅读取一行文本,因此它会忽略listing2-1.txt文件中的其余行。
您可以在同一命令上重定向标准输入和标准输出。考虑以下内容:
C:\>listing1-8 <listing2-1.txt >listing1-8.txt
这将从listing2-1.txt文件中读取数据并将所有输出发送到listing1-8.txt文件。
将程序的输出重定向到文本文件时,如果输出文件已存在,Windows 将在将标准输出文本写入该文件之前删除该文件。您还可以使用以下输出重定向语法(使用两个大于号)指示 Windows 将命令的输出附加到现有文件:
command options >>filename more_options
除重定向选项之外的命令行选项通常是文件名(例如ml64 mySource.asm
)或控制命令行为的选项(例如 ml64/c
或/Fl
本书中会用到的命令行选项)。按照惯例,大多数 Windows CLI 命令/
在实际选项(而不是文件名)前使用斜杠字符 ( ) 作为前缀。这是一种惯例,而不是硬性要求。
例如,某些命令使用 Unix 约定的破折号或连字符 ( -
) 来代替(或除了)斜杠字符。这实际上是特定于应用程序的选择。有关详细信息,请参阅您正在使用的特定程序的文档。所有内置 CLI 命令和大多数 Microsoft CLI 程序都使用斜杠字符来指定选项。
D.2 目录名称和驱动器号
许多命令接受或要求将文件或目录路径名作为命令行选项。路径名由两个主要部分组成:驱动器号和目录或文件路径名。驱动器号是单个字母字符(A 到 Z),后跟冒号;例如:
A: B: C: etc.
驱动器字母不区分大小写。A:
相当于a:
命令行中的。Windows 为软盘驱动器保留驱动器字母 A: 和 B:。由于现代机器上不经常看到软盘驱动器,因此您可能不会使用这些驱动器字母。但是,如果您有一台非常老旧的机器...
C: 是启动驱动器的默认驱动器号。如果您的机器中只有一个硬盘驱动器(或 SSD),Windows 可能会将 C: 与该驱动器关联。本书中出现的示例假设您在驱动器 C: 上操作(尽管这绝不是必需的)。
如果您有多个驱动器(多个物理驱动器单元,或者您已将硬盘驱动器分区为多个逻辑驱动器),Windows通常将连续的驱动器字母(D:、E: 等)与这些附加驱动器关联。您可以根据需要重新分配驱动器字母,因此不能保证所有驱动器字母在字母表中都是连续的。
您可以在命令行中单独输入字母和冒号来切换默认驱动器号。例如,
D:
将默认驱动器切换为 D:,假设存在这样的驱动器。如果驱动器不存在,Windows 会抱怨系统找不到指定的驱动器,并且不会更改默认驱动器。
通常(您可以更改此设置),Windows 会将当前驱动器号显示为命令行提示符的一部分(默认情况下,它还会显示默认路径名)。例如,典型的 Windows 命令行提示符如下所示:
C:\>
\
命令提示符中出现的字符是当前(默认)目录。在本例中,本身\
表示 C: 驱动器上的根(或主)目录。如果当前目录是其他目录,Windows 会在驱动器号后列出该目录。例如,如果当前目录是\WINDOWS
,CLI 会将以下内容显示为命令行提示符:
C:\WINDOWS>
您可能已经知道,Windows 具有分层文件系统,允许在(子)目录中包含子目录。反斜杠字符用于分隔完整路径名中的目录名。在 Windows 中,您通常会看到两种路径名形式:完整路径名和部分路径名。
完整路径名以反斜杠 ( \
) 字符开头,从根目录开始。部分路径名不以反斜杠开头,路径以当前(默认)目录开头(部分路径名中的第一个子目录必须出现在当前默认子目录中)。
空格通常用于分隔命令行上的选项。如果路径名中出现空格,则必须用引号将整个路径名括起来;例如:
"\This\Path name\has\a\space"
CLI 支持在路径名中使用一对通配符。星号 ( *
) 将匹配零个或多个字符。问号 ( ?
) 将匹配零个或一个字符。
命令必须明确支持通配符;Windows CLI 命令支持通配符选项,大多数 Microsoft 工具也支持通配符选项(例如ml64.exe)。并非所有可执行文件都支持文件名中的通配符,但是。通配符可用于目录名和文件名。但是,它们不会替换\
路径名中的反斜杠字符 ( )。
D.3 一些有用的内置命令
Windows CLI 包含许多内置命令(这些命令是cmd.exe程序的一部分,不需要单独的.exe或.bat文件)。这里有太多内置命令需要考虑(而且您不会使用其中的大多数命令);因此,本节仅介绍一些最常用的命令。
D.3.1 cd 和 chdir 命令
cd
(更改目录)命令将默认目录切换为您在命令行选项中指定的目录。请注意,chdir
是的同义词cd
。其语法是
cd directory_name
其中directory_name是新目录的完整或部分路径名。例如:
cd \masm32\examples
该cd
命令通常不会更改默认驱动器号,即使您将其指定为路径名的一部分。例如,如果当前驱动器号为 D:,则以下命令不会直接更改默认驱动器号和路径名:
D:\>cd C:\masm32\examples
D:\>
请注意,命令提示符D:\>
在cd
命令后仍然存在。但是,如果您切换到 C: 驱动器(使用命令C:
),Windows 将根据上一个命令设置默认目录:
D:>C:
C:\masm32\examples>
如您所见,默认目录与驱动器号相关联(并且每个驱动器号都维护自己的默认目录)。
如果您想使用该命令切换驱动器号和路径名,只需在路径名前cd
提供选项:/d
D:\>cd /d C:\masm32\examples
C:\masm32\examples
不要忘记,如果路径名包含空格,则使用cd
命令时必须将路径名括在引号中:
cd /d "C:\program files"
下面显示该cd
命令的帮助信息:
cd /?
cd
如果单独发出该命令(没有命令行参数),该命令将显示当前(默认)路径名。
D.3.2 cls 命令
该cls
命令会清除屏幕(至少是命令窗口)。当您想在编译之前清除屏幕,并希望在命令窗口回滚时只看到与该特定编译相关的消息时,这很有用。
D.3.3 copy 命令
该copy
命令将一个或多个文件复制到其他位置。通常,您可以使用此命令在当前目录中制作文件的备份副本,或将文件复制到不同的子目录中。此命令的语法如下:
copy source_filename destination_filename
此命令复制由source_filename指定的文件以及与destination_filename重复的名称。两个名称都可以是完整路径名或部分路径名。
该copy
命令支持多个命令行选项(除了源文件名和目标文件名)。您可能不会经常使用这些选项。有关更多详细信息,请发出以下帮助命令:
copy /?
D.3.4 date 命令
该date
命令本身会显示当前系统日期并提示您输入新日期(这将永久设置系统日期 — 因此请小心使用!)。使用/t
命令行选项时,此命令将仅显示日期,而不会要求您更改它。以下是示例:
C:\>date /t
Sat 02/23/2019
像往常一样,date /?
显示此命令的帮助信息。
D.3.5 del(擦除)命令
命令del
(erase
是的同义词del
)将删除您作为命令行选项指定的文件。语法是
del options files_to_delete
其中options是以斜杠开头的命令行选项,files_to_delete是要删除的文件名(路径名)列表,以空格或逗号分隔。此命令接受通配符;例如,以下命令将删除当前目录中出现的所有.obj文件:
del *.obj
不用说,使用此命令时应该非常小心,尤其是使用通配符时。例如,考虑以下命令(可能是拼写错误):
del * .obj
这将删除当前目录中的所有文件,然后尝试删除名为.obj的文件(该命令删除子目录中的所有文件后,该文件将不再存在)。
此命令与一些有用的命令行选项相关联。使用以下/?
选项来了解它们:
C:\>del /?
D.3.6 dir 命令
dir
(directory )命令是比较有用的 CLI 命令之一。它显示目录列表(目录中的文件列表)。
不使用任何命令行选项,此命令将显示当前目录中的所有文件。使用单个驱动器号(和冒号)作为参数,此命令将显示指定驱动器上默认目录中的所有文件。使用指向子目录的路径名,此命令将显示指定目录中的所有文件。使用指向单个文件名的路径名,此命令将显示有关该特定文件的目录信息。
与往常一样,此命令支持多个以斜杠字符开头的命令行选项。用于dir /?
获取此命令的帮助信息。
D.3.7 more 命令
该more
命令一次显示一屏文本文件中的文本。显示一屏文本后,它会等待用户按下键盘上的ENTER或空格键。按空格键将输出向前推进一屏满屏的文本;按ENTER 键将输出前进一行。按 Q 键终止程序。
该more
命令需要命令行上的一个或多个文件名作为参数。如果您指定两个或更多文件,more
将按顺序显示输出。该more
命令还允许使用多个命令行选项。您可以使用以下命令了解它们:
more /?
D.3.8 move 命令
该move
命令将文件从一个位置移动到另一个位置(移动文件时可能会重命名文件)。它类似于copy
,但move
在移动文件后会从其原始位置删除文件。此命令的基本语法如下:
move original_file new_file
与往常一样,/?
命令行选项为该命令提供帮助。
D.3.9 ren 和 rename 命令
该ren
命令(rename
是同义词)更改文件的名称。语法是
ren original_filename new_filename
其中(显然)original_filename是您要更改的旧文件名,new_filename是您要使用的文件的新名称。新旧文件必须位于同一目录中。move
如果您想在重命名文件时将其移动到新目录,请使用该命令。
D.3.10 rd 和 rmdir 命令
该rd
命令(rmdir
是同义词)删除目录。使用此命令之前目录必须是空的(尽管/s
选项可以覆盖这一点)。此命令的基本语法是
rd directory_path
其中directory_path是要删除的目录的路径。使用rd /?
命令获取帮助。
D.3.11 time 命令
如果不带参数,该time
命令将显示当前系统时间并提示您更改它。如果带/t
命令行参数,time
则仅显示当前时间。用于/?
显示此命令的帮助信息。
D.4 更多信息
本附录仅提供了对 Windows 命令行解释器的简要介绍 — 仅提供足够的信息来使用 MASM 有效地编译和运行汇编语言程序。CLI 支持数十个内置命令(如果不是超过一百个的话)。了解这些命令的一个地方是https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/cmd/。