Assembly NASM错误地计算标签位置
我使用NASM创建一个小型PE可执行文件,我有MZ头、DOS存根程序和PE头。不幸的是,我突然发现NASM无法计算其中一个标签的相对位置,也无法保存正确的PE头地址。我的代码如下所示: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
%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一起使用才是真正的解决方案