将 NASM 集成到用 C 编写的编译器

Integrate NASM to a compiler written in C

我有一个生成 nasm 程序集的 C 程序。我如何使用 nasm assemble 然后使用 ld link 生成最终的可执行文件?

最简单的方法是将编译器的输出通过管道传输到 nasm,但我希望该过程对用户而言简单:只需键入 compiler myfile 并获得可执行文件。即使我会走那条简单的路线,nasm 似乎也不接受来自标准输入的文件;你必须将它们指定为参数。

到目前为止我所拥有的是:将程序集输出到 stdout,在主进程的 stdout 和子进程的 stdin 之间创建一个管道,这个过程将是对 nasm /dev/stdin 的调用。我在这里做错了什么?

事实上,您建议的过程将不起作用,因为 nasm 读取其输入文件两次(除非您使用 -a 标志抑制预处理器传递)。

所以 /dev/stdin 必须是普通文件,而不是管道。如果它是一个普通文件,它还不如有一个名字。

所以只需将输出写入一个临时文件,对该文件调用 nasm,然后将其删除。

这不是答案,而是关于如何实现此类帮助脚本的建议:

#!/bin/sh
SrcDir="$(mktemp -d)" || exit 1
trap "rm -rf '$SrcDir'" EXIT

cat > "$SrcDir/source.asm"
nasm "$@" "$SrcDir/source.asm"

mktemp -d 创建一个新的临时目录。当 shell 退出时,trap 删除该目录及其所有内容。请注意,因为该命令在双引号中,所以在设置陷阱时会评估目录路径。如果以后再改SrcDir,对陷阱一点影响都没有;原始临时目录被使用和删除。

脚本的任何参数都将按原样传递给 nasm(由于 "$@"),临时文件的路径作为最终参数。

这个模式在各种情况下都很有用,因为即使脚本被中止,临时目录也会被删除(因为说 Ctrl+C 或因为脚本中的错误)。