MASM中没有堆栈段警告

时间:2015-11-06 06:17:18

标签: assembly stack warnings masm

我是集会上的乞丐。 我试图用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

2 个答案:

答案 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)以手动方式显式分配SSSP。 SS <-stk段的地址。 SP <-栈顶地址。进一步的推送/弹出将正常运行。