我想以可移植到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
的东西,但是它允许定义字符串,并且适用于飞蛾gas
和nasm
?
答案 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 eax
或nasm '-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 00
,mov 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