NASM能否使用机器码hexdump + asm源生成文件?

时间:2017-06-30 07:51:08

标签: assembly x86 nasm

如果我有以下汇编代码:

mov eax, 123
mov ebx, 321

NASM是否可以生成一个文件,显示我显示的汇编代码的相应机器代码,例如:

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

1 个答案:

答案 0 :(得分:6)

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

  1. 让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说明不会映射到问题中显示的机器代码...我不知道您在哪里获得这些值。也许你刚刚完成了它们?

  2. 反汇编由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。您可能希望将其重定向到文件。具体取决于您使用的操作系统;有关说明,请参阅命令解释程序的文档。

相关问题