NASM错误地计算标签位置

时间:2013-06-25 19:55:54

标签: assembly dos nasm portable-executable

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

0 个答案:

没有答案