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绝对可以做到这一点。有两种基本方法:
让 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
指令未映射到问题中显示的机器代码……我不知道您从哪里获得这些值。也许你只是编造的?
反汇编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 会将其输出打印到标准输出。您可能希望将其重定向到一个文件。具体怎么做取决于您使用的操作系统;有关说明,请参阅命令解释器的文档。
如果我有以下汇编代码:
mov eax, 123
mov ebx, 321
能否NASM生成一个文件,显示我展示的汇编代码对应的机器码,例如:
F2 FF A3 mov eax, 123
D7 D1 A1 mov ebx, 321
是的,NASM绝对可以做到这一点。有两种基本方法:
让 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
指令未映射到问题中显示的机器代码……我不知道您从哪里获得这些值。也许你只是编造的?反汇编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 会将其输出打印到标准输出。您可能希望将其重定向到一个文件。具体怎么做取决于您使用的操作系统;有关说明,请参阅命令解释器的文档。