使用MASM 5.0时未向. exe文件添加堆栈字节



我正在为DOS编写3个汇编文件:

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 

hm2b.asm:

DGROUP group _DATA, STACK  ; Required by MASM 3.0 and 4.0. 

STACK segment para stack 'STACK' 
db 100h dup (?) 
STACK ends 

_DATA segment word public 'DATA' 
message db "Hello, World!", 0dh, 0ah, '$' 
_DATA ends 

; 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. `seg _DATA' also works. 
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 

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.00masm.exe编译,然后链接到一个。exe文件与相应的link.exe。但是,hm2b.exehm2.exehm3.exe长256 == 100h字节,因为它包含零字节的STACK。我如何摆脱这些零字节不使用.model.stack,从而与微软宏汇编4.00和更早版本兼容?

我在这里找到了一份MASM 3.00手册。在第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

我能够组装并链接到一个640字节的exe文件。当我增加堆栈大小(从64到1024)时,exe大小没有改变,由此我假设链接器没有填充图像中未初始化的堆栈字节。如果你将示例程序与你的程序进行比较,也许会帮助你弄清楚。

可能的答案是删除DGROUP指令。

对于旧式代码(没有.model指令和没有dosseg指令),例如:hm2b。asmhm2.asm),STACK segment必须是链接器省略的末尾00字节的最后一个。此外,_TEXT和_DATA段的顺序决定了它们被写入.exe程序输出文件的顺序。DGROUP group中段的顺序无关。

对于新风格的代码(带有.model指令或dosseg指令),均支持Microsoft Macro Assembler 5.00及以后版本;例如:hm3.asm),.stack,.data.code指令的顺序无关紧要。汇编程序以正确的顺序(_TEXT, _DATA, STACK)生成。obj文件。

一般来说,.asm文件中的段顺序会传播到.obj文件中,链接器使用它来决定最终.exe文件中的顺序。

最新更新