我使用 NASM 创建一个小的 PE 可执行文件,我有 MZ 标头、DOS 存根程序和 PE 标头。不幸的是,我突然发现 NASM 无法计算其中一个标签的相对位置,也无法保存正确的 PE 标头地址。我的代码如下所示:
%macro orgup 2
org (((%1+(%2-1))/%2)*%2)
%endmacro
DOS_HEADER:
dw "MZ"
dw PE_HEADER - DOS_HEADER
dw 1
dw 0
dw 4
dw 0
dw 65535
dw 0
dw 0x00B8
dw 0
dw 0
dw 0
dw 0x0040
dw 0
dq 0
dw 0
dw 0
times 20 db 0
dd PE_HEADER ; This should be 80 00 but instead it is 80 10
DOS_PROGRAM:
; This is where I have my little DOS program
PE_HEADER: ; In the binary it starts at 0x8000
db "PE", 0, 0
; And so on ...
OPTIONAL_HEADER:
dw 0x010B
; And so on ...
TEXT_SECTION_HEADER:
db ".text" ,0 ,0 ,0
; And so on ...
TEXT_SECTION_HEADER:
db ".bss" ,0 ,0 ,0
; And so on ...
use32
align 512
rawstart:
orgup $-$$, 4096 ; THIS IS WHAT PRODUCES THE PROBLEM.
; And so on
所以,当orgup
宏在那里时,地址PE_HEADER
是1080h(它与 的第二个参数有某种关联orgup
)。如果我评论那行,地址是80h(正确)。因此,看起来 NASM 在use32
部分.text
部分或其他内容之前考虑了代码。我如何指定之前的所有内容都rawstart
必须从原点 0 以 16 位计算?