我是集会上的乞丐。 我试图用MASM在屏幕上打印一封信。我定义了堆栈段,但是当我尝试链接程序时,得到了这个警告:
链接:警告L4021:没有堆栈段
然而程序运行正常! 我怎样才能解决这个问题?请用简单的话来解释。谢谢。
printa.asm:
stk segment
DW 32 dup(?)
stk ends
cds segment
assume cs:cds,ss:stk
main proc far
mov ah,02
mov dl, 'A'
int 21h
mov ah,01
int 21h
mov ah,4ch
int 21h
main endp
cds ends
END main
printa.lst:
Microsoft (R) Macro Assembler Version 6.00 11/06/15 09:38:16
printa.asm Page 1 - 1
0000 stk segment
0000 0020 [ DW 32 dup(?)
0000
]
0040 stk ends
0000 cds segment
assume cs:cds,ss:stk
0000 main proc far
0000 B4 02 mov ah,02
0002 B2 41 mov dl, 'A'
0004 CD 21 int 21h
0006 B4 01 mov ah,01
0008 CD 21 int 21h
000A B4 4C mov ah,4ch
000C CD 21 int 21h
000E main endp
000E cds ends
END main
Microsoft (R) Macro Assembler Version 6.00 11/06/15 09:38:16
printa.asm Symbols 2 - 1
Segments and Groups:
N a m e Size Length Align Combine Class
cds . . . . . . . . . . . . . . 16 Bit 000E Para Private
stk . . . . . . . . . . . . . . 16 Bit 0040 Para Private
Procedures, parameters and locals:
N a m e Type Value Attr
main . . . . . . . . . . . . . . P Far 0000 cds Length= 000E Private
0 Warnings
0 Errors
答案 0 :(得分:3)
我找到了解决方案。 我们需要为堆栈段定义“组合类型”。
stk segment
应该是:
stk segment stack
唯一适用于堆栈段的组合类型是“堆栈”。
答案 1 :(得分:0)
assume cs:cds,ss:stk
stk segment STACK 'STACK'
dw 32 dup(0)
stk ends
cds segment
main:
mov ax,4c00h
int 21h
cds ends
end main
Synopsis(MASM官方参考)
ref1::根据jmalak,第一个STACK
不带引号会将STACK combine type attritute附加到stk
段,而用引号引起来的第二个'STACK'
(带引号)将class属性附加到is。
ref2:由a detailed explanation引用Margaret Bloom:
与PUBLIC相同的堆栈,但是在生成的二进制文件中,创建了元数据,以便操作系统使用此属性将SS:SP设置为段的末尾(在发生串联之后)。
段定义SSEG SEGMENT STACK'STACK'使用以下内容定义段:
*名称SSEG。
*组合属性STACK,使链接器发出元数据以将SS:SP设置为指向它的末尾。
*类属性“ STACK”使链接程序将其识别为堆栈段。
但是有一个丑陋的方法可以做到:
assume cs:cds,ss:stk
stk segment
dw 32 dup(0)
stk ends
cds segment
main:
mov ss,stk ; (1)
mov sp,64 ; (2)
mov ax,4c00h
int 21h
cds ends
end main
(1)(2)以手动方式显式分配SS:SP。 SS <-stk
段的地址。 SP <-栈顶地址。进一步的推送/弹出将正常运行。