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