NASM 机器码hexdump + asm source 可以生成文件吗?

Can NASM generate a file with machine code hexdump + asm source?

如果我有以下汇编代码:

mov eax, 123
mov ebx, 321

能否NASM生成一个文件,显示我展示的汇编代码对应的机器码,例如:

F2 FF A3    mov eax, 123
D7 D1 A1    mov ebx, 321

是的,NASM绝对可以做到这一点。有两种基本方法:

  1. 让 NASM 在汇编您的代码时生成一个 "listing" 文件。

    为此,请在调用 NASM 时在命令行中传递 the -l option。如果愿意,您可以指定一个可选的文件名(通常使用 .lst 扩展名,但不是必需的):

    nasm -f <format> SourceFile.asm -l ListingFile.lst
    

    一个"listing"文件在左边显示地址和代码字节,在右边显示汇编助记符。它还包含多行宏的扩展(使用 the .nolist qualifier 定义的除外)。

    这不会禁止汇编(仍会生成正常的目标文件输出),因此您可以在 Makefile 中打开此选项并保留它。

    这是一个非常简单的源文件的列表文件示例:

    1 00000000 B87B000000              mov eax, 123
    2 00000005 BB41010000              mov ebx, 321
    3 0000000A CD80                    int 0x80
    4 0000000C C3                      ret
    

    第一列是源代码的行号,第二列是address/offset,第三列是二进制值(对于指令,这些是机器代码字节;对于数据,这将是原始二进制数据)。最右边的第四列是实际的指令助记符,如您的源代码中所示。

    请注意,MOV 指令未映射到问题中显示的机器代码……我不知道您从哪里获得这些值。也许你只是编造的?

  2. 反汇编NASM生成的目标文件或二进制文件。

    基本上,您 运行 汇编程序生成输出文件,然后您 运行 通过反汇编程序返回。 NASM 带有一个反编译器,叫做 NDISASM。语法是:

    ndisasm -b {16|32|64} filename
    

    其中 the -b option 指定文件的位数,这会影响字节如何解码为助记符。 NDISASM 默认为 16 位,但您可能需要 32 位或 64 位。

    您可以在上面链接的文档中阅读一些其他选项。这些通常会派上用场,例如为 COM 文件指定来源 (-o), specifying a sync point to ignore data (-s), and skipping a header of a certain size (-e)。

    这是 NDISASM 的输出示例:

    00000000  B87B000000        mov eax,0x7b
    00000005  BB41010000        mov ebx,0x141
    0000000A  CD80              int 0x80
    0000000C  C3                ret
    

    (这里没有行号,因为没有使用源代码。它只是反汇编一个二进制文件,就像你在你的机器上对 any 二进制文件所做的一样,无论或者你没有原始源代码。)

    请注意 NDISASM 会将其输出打印到标准输出。您可能希望将其重定向到一个文件。具体怎么做取决于您使用的操作系统;有关说明,请参阅命令解释器的文档。