在NASM和GCC中提供incbin路径作为预定义的宏

时间:2019-05-25 12:55:19

标签: gcc assembly nasm gas

我想以可移植到Windows和Linux的方式将二进制文件嵌入可执行文件中。

为实现此目的,我想使用带有伪指令incbin的程序集文件。例如:

.intel_syntax noprefix


      .global _img0_start
      .global _img0_end
      .global _img0_size


_img0_start:   .incbin "img0.bin"
_img0_end:
_img0_size:    .quad  $ -  _img0_start

在编译上面的汇编文件之前,我不知道二进制文件的位置,因此我想用宏替换img0.bin ,并在命令行参数中定义它就像我使用gcc选项-D定义宏常量一样。

我已经看到存在-d Option: Pre-Define a Macro,它可以完全执行上述操作,但仅适用于数值(我需要提供文件的路径)。 (字体:https://www.nasm.us/doc/nasmdoc2.html#section-2.1.19

是否有类似-d的东西,但是它允许定义字符串,并且适用于飞蛾gasnasm

2 个答案:

答案 0 :(得分:2)

我已经阅读了更多的书,并且我意识到不需要扩展为字符串的宏。

相反,可以做的只是为二进制文件(在我的情况下为img0.bin)提供一个固定的名称,然后使用-I选项为搜索该文件提供额外的路径。 / p>

换句话说,使用与上面相同的汇编文件(将其命名为assembly_file.s),只需执行以下操作:

gcc -c assembly_file.s -I<path_to_folder_that_contains_img0.bin> -o <output_file_name>

答案 1 :(得分:0)

NASM宏和C预处理器都允许使用任意字符串。

NASM equ常数必须是整数,但是%define foo eaxnasm '-DIMG="foo.bin"'都可以工作。

请注意,宏定义包含了双引号。 CPP使得在双引号内扩展宏变得容易,但是我没有费心检查NASM是否可以轻松做到这一点。

在Make或类似的东西中创建双引号的字符串通常很容易。


;;; foo-nasm.asm  NASM source
incbin IMG
# foo-gas.S   GAS source (capital S gets GCC to run it through CPP)
.incbin IMG

hi.bin包含B8 68 69 00 00mov eax, 'hi'的32/64位机器代码


 $ gcc -c foo-gas.S -DIMG='"hi.bin"'            
 $ nasm -felf64 foo-nasm.asm -DIMG='"hi.bin"'       

$ disas foo-gas.o
...
0000000000000000 <.text>:
   0:   b8 68 69 00 00          mov    eax,0x6968

$ disas foo-nasm.o
...
0000000000000000 <.text>:
   0:   b8 68 69 00 00          mov    eax,0x6968