不使用 MASM 5.0 将堆栈字节添加到 .EXE 文件
Not adding the stack bytes to the .EXE file with MASM 5.0
我正在为 DOS 编写两个汇编文件:
hm2.asm:
.8086
DGROUP group _DATA, STACK ; Required by MASM 3.0 and 4.0.
; MASM 4.0 doesn't support USE16 (but MASM >=5.0 does).
_TEXT segment word public 'CODE'
assume cs:_TEXT, ds:DGROUP, ss:STACK
main proc
mov ax, DGROUP ; Initialize DS.
mov ds, ax
mov ah, 9 ; DOS Function call to print a message.
mov dx, offset message
int 21h
mov ax, 4c00h ; DOS Function call to exit back to DOS.
int 21h
main endp
_TEXT ends
_DATA segment word public 'DATA'
message db "Hello, World!", 0dh, 0ah, '$'
_DATA ends
STACK segment para stack 'STACK'
db 100h dup (?)
STACK ends
end main
hm3.asm:
.8086
.model small
.stack 100h
.data
message db "Hello, World!", 0dh, 0ah, '$'
.code
main proc
mov ax, @data ; Initialize DS.
mov ds, ax
mov ah, 9 ; DOS Function call to print a message.
mov dx, offset message
int 21h
mov ax, 4c00h ; DOS Function call to exit back to DOS.
int 21h
main endp
end main
我希望这些在使用 Microsoft Macro Assembler 5.00 masm.exe 编译时是相同的,然后链接到具有相应 [ 的 .EXE 文件=34=]。但是,hm2.exe 比 hm3.exe 长约 256 == 100h 字节,因为它包含零字节STACK
。如何在不使用 .model
和 .stack
的情况下删除这些零字节,从而与 Microsoft Macro Assembler 4.00 及更早版本兼容?
我找到了 MASM 3.00 手册的副本 here。在第 3-2 页有一个示例程序,如下所示
.8086
DATA segment ; Program Data Segment
STRING db "Hello .", 13, 10, "$"
DATA ends
CODE segment ; Program Code Segment
assume cs :CODE, ds :DATA
START: ; Program Entry Point
mov ax, seg DATA
mov ds, ax
mov dx, offset STRING
mov ah, 9
int 21h
mov ah, 4ch
int 21h
CODE ends
STACK segment stack ; Program Stack Segment
assume ss :STACK
dw 64 dup(?)
STACK ends
end START
我能够 assemble 和 link 将其转换为 640 字节的 exe。当我增加堆栈大小(从 64 到 1024)时,exe 大小没有改变,据此我假设 linker 没有填充图像中的单元化堆栈字节。
如果您将示例程序与您的示例程序进行比较,也许这会帮助您弄明白。
可能的答案是删除 DGROUP 指令。
对于 old-style 代码(没有 .model
指令),STACK segment
必须是链接器省略尾随 00 字节的最后一个。此外,_TEXT 和 _DATA 段的顺序决定了它们写入 .exe 程序输出文件的顺序。 DGROUP group
中的段顺序无关紧要。
对于 new-style 代码(带有 .model
指令,Microsoft Macro Assembler 5.00 及更高版本支持),.stack
、.data
和 [=16 的顺序=] 指令无关紧要。汇编程序以正确的顺序生成 .obj 文件(.code
、.data
、.stack
)。
通常,.asm 文件中段的顺序会传播到 .obj 文件,链接器使用它来决定最终 .exe 文件中的顺序。
我正在为 DOS 编写两个汇编文件:
hm2.asm:
.8086
DGROUP group _DATA, STACK ; Required by MASM 3.0 and 4.0.
; MASM 4.0 doesn't support USE16 (but MASM >=5.0 does).
_TEXT segment word public 'CODE'
assume cs:_TEXT, ds:DGROUP, ss:STACK
main proc
mov ax, DGROUP ; Initialize DS.
mov ds, ax
mov ah, 9 ; DOS Function call to print a message.
mov dx, offset message
int 21h
mov ax, 4c00h ; DOS Function call to exit back to DOS.
int 21h
main endp
_TEXT ends
_DATA segment word public 'DATA'
message db "Hello, World!", 0dh, 0ah, '$'
_DATA ends
STACK segment para stack 'STACK'
db 100h dup (?)
STACK ends
end main
hm3.asm:
.8086
.model small
.stack 100h
.data
message db "Hello, World!", 0dh, 0ah, '$'
.code
main proc
mov ax, @data ; Initialize DS.
mov ds, ax
mov ah, 9 ; DOS Function call to print a message.
mov dx, offset message
int 21h
mov ax, 4c00h ; DOS Function call to exit back to DOS.
int 21h
main endp
end main
我希望这些在使用 Microsoft Macro Assembler 5.00 masm.exe 编译时是相同的,然后链接到具有相应 [ 的 .EXE 文件=34=]。但是,hm2.exe 比 hm3.exe 长约 256 == 100h 字节,因为它包含零字节STACK
。如何在不使用 .model
和 .stack
的情况下删除这些零字节,从而与 Microsoft Macro Assembler 4.00 及更早版本兼容?
我找到了 MASM 3.00 手册的副本 here。在第 3-2 页有一个示例程序,如下所示
.8086
DATA segment ; Program Data Segment
STRING db "Hello .", 13, 10, "$"
DATA ends
CODE segment ; Program Code Segment
assume cs :CODE, ds :DATA
START: ; Program Entry Point
mov ax, seg DATA
mov ds, ax
mov dx, offset STRING
mov ah, 9
int 21h
mov ah, 4ch
int 21h
CODE ends
STACK segment stack ; Program Stack Segment
assume ss :STACK
dw 64 dup(?)
STACK ends
end START
我能够 assemble 和 link 将其转换为 640 字节的 exe。当我增加堆栈大小(从 64 到 1024)时,exe 大小没有改变,据此我假设 linker 没有填充图像中的单元化堆栈字节。 如果您将示例程序与您的示例程序进行比较,也许这会帮助您弄明白。
可能的答案是删除 DGROUP 指令。
对于 old-style 代码(没有 .model
指令),STACK segment
必须是链接器省略尾随 00 字节的最后一个。此外,_TEXT 和 _DATA 段的顺序决定了它们写入 .exe 程序输出文件的顺序。 DGROUP group
中的段顺序无关紧要。
对于 new-style 代码(带有 .model
指令,Microsoft Macro Assembler 5.00 及更高版本支持),.stack
、.data
和 [=16 的顺序=] 指令无关紧要。汇编程序以正确的顺序生成 .obj 文件(.code
、.data
、.stack
)。
通常,.asm 文件中段的顺序会传播到 .obj 文件,链接器使用它来决定最终 .exe 文件中的顺序。