我使用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位计算?