1

我使用 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_HEADER1080h(它与 的第二个参数有某种关联orgup)。如果我评论那行,地址是80h(正确)。因此,看起来 NASM 在use32部分.text部分或其他内容之前考虑了代码。我如何指定之前的所有内容都rawstart必须从原点 0 以 16 位计算?

4

0 回答 0