【问题标题】:'.' is not recognized when attempting to run assembly code?'。尝试运行汇编代码时无法识别?
【发布时间】:2020-09-11 02:39:16
【问题描述】:

我在汇编中编写了一些代码,并将 .asm 文件放在 NASM 文件夹中

执行了以下命令: nasm -f elf test.asmld test.o -o test 在 nasm 控制台中

但是当我尝试使用 ./test 来运行代码时, 我收到了错误'.' is not recognized as an internal or external command, operable program or batch file.

我为弄清楚如何运行汇编代码而访问的所有网站都说我应该只做 ./thingy.asm 但这显然不起作用,所以我不知道该怎么做!

如果它有助于我的操作系统是 Windows 10,我的 NASM 版本是 2.15.05

【问题讨论】:

  • 对此可能有一个非常简单的解释,但我自己有点太愚蠢了/:
  • Windows 程序具有 EXE 扩展名,您不能通过放置 ./ 从本地目录运行它们。 ./ 适用于类 Unix 系统。
  • 那么我的程序编译后如何运行呢?
  • assemble* 不编译
  • 好吧,您没有向您的程序显示代码。我希望它使用 Windows 调用约定。如果它是一个 Windows 程序,您必须使用链接器 (ld) 输出一个名为 test.exe 的文件,而不是一个名为 test 的文件。然后,您可以通过在命令行上键入 test.exe 来运行它。如果你展示了你的程序,我会告诉你你所拥有的是否真的有效。由于您使用的是elf,因此我担心您正在创建什么样的程序

标签: assembly nasm


【解决方案1】:
'.' is not recognized as an internal or external command

背景信息

原因是 Windows 与 Linux 或 Unix 的工作方式不同(显然您的教程描述了如何使用 Linux):

如果文件名以.exe 结尾,Windows 会将该文件识别为应用程序。如果文件名以.bat 结尾,Windows 会将该文件识别为“批处理”文件。

在 Linux 或 Unix 下这是完全不同的:应用程序或“批处理”(*) 文件可以有任何文件名;一个文件用一个特殊的标志“标记”,告诉操作系统该文件可以执行。如果设置了该标志,则操作系统使用文件内容(不是文件名的后缀)来区分可执行文件的类型(例如应用程序、“批处理”文件、Python 程序...)。

命令行ld test.o -o test 将生成一个名为test 的文件,而不是test.exe。在 Linux 下,这将是应用程序的有效文件名,在 Windows 下,文件名必须以 .exe 结尾,因此这不是有效的文件名。

如果您愿意,可以在 Linux 下随意命名“批处理”文件 test.exe 和应用程序 test.bat

在 Linux 下,命令 ./test 将在当前目录中启动一个名为 test 的应用程序; ./test.exe 将启动一个名为 test.exe 的应用程序或“批处理”文件。

在 Windows 下,执行名为 test.exe 的文件的命令将只是 test,而不是 ./test.exe

关于您的问题

首先,您必须重命名输出文件:ld test.o -o test.exe

下一个问题是你的程序肯定不能在 Windows 上运行:

至少 Windows 7(我不确定 Windows 10)会拒绝启动不使用任何 DLL 文件的应用程序;并且命令行ld test.o -o test.exe 会生成一个不使用任何DLL 文件的应用程序。

我很确定您的汇编程序包含int 指令或syscall 指令。

直接调用这些指令是操作系统特定的:

调用int 0x80(或int 80hint $0x80,具体取决于所使用的汇编程序)的程序只能在Linux 上运行!


(*) 这种文件类型被命名为“shell脚本”,而不是Linux中的“批处理文件”;但是,这主要是术语上的差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 2022-01-21
    • 2022-08-09
    • 2019-09-22
    • 1970-01-01
    • 2018-06-05
    相关资源
    最近更新 更多