如果我有以下汇编代码:
mov eax, 123
mov ebx, 321
NASM是否可以生成一个文件,显示我显示的汇编代码的相应机器代码,例如:
F2 FF A3 mov eax, 123
D7 D1 A1 mov ebx, 321
答案 0 :(得分:6)
是的,NASM绝对可以做到这一点。有两种基本方法:
让NASM生成"列表"文件,因为它组装你的代码。
要执行此操作,请在调用NASM时在命令行上传递the -l
option。如果您愿意,可以指定一个可选的文件名(通常使用.lst
扩展名,但不是必需的):
nasm -f <format> SourceFile.asm -l ListingFile.lst
A&#34;列出&#34; file显示左侧的地址和代码字节,右侧是汇编助记符。它还包含多行宏的扩展(除了那些用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
第一列是源代码中的行号,第二列是地址/偏移量,第三列是二进制值(对于指令,这些是机器代码字节;对于数据,这将是原始二进制数据)。第四个最右边的列是实际的指令助记符,如源代码中所示。
请注意,MOV
说明不会映射到问题中显示的机器代码...我不知道您在哪里获得这些值。也许你刚刚完成了它们?
反汇编由NASM生成的目标文件或二进制文件。
基本上,你运行汇编程序来生成输出文件,然后通过反汇编程序运行它。 NASM附带一个名为NDISASM的解散器。语法是:
ndisasm -b {16|32|64} filename
其中the -b
option指定文件的位数,这会影响字节如何解码为助记符。 NDISASM默认为16位,但您可能需要32位或64位。
您可以在上面链接的文档中阅读其他一些选项。这些通常会派上用场,比如指定COM文件的原点(-o
),指定同步点以忽略数据(-s
),并跳过特定大小的标题({{3} })。
以下是NDISASM的输出示例:
00000000 B87B000000 mov eax,0x7b
00000005 BB41010000 mov ebx,0x141
0000000A CD80 int 0x80
0000000C C3 ret
(此处没有行号,因为源代码未被使用。它只是反汇编二进制文件,与您在计算机上任何二进制文件所做的相同,你是否有原始的源代码。)
请注意,NDISASM会将其输出打印到stdout。您可能希望将其重定向到文件。具体取决于您使用的操作系统;有关说明,请参阅命令解释程序的文档。