Assembly NASM错误地计算标签位置

Assembly NASM错误地计算标签位置,assembly,dos,nasm,portable-executable,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 655

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

MZ
标题:要么
db“MZ”
要么
dw“ZM”
,而不是
dw“MZ”
。Nasm将只接受一条
org
指令。考虑创建一个新的<代码>部分>代码>使用<代码> vStase= 属性以获得相同的效果。有关详细信息,请参阅友好手册。谢谢。将section与vstart一起使用才是真正的解决方案