【问题标题】:No stack segment warning in MASMMASM 中没有堆栈段警告
【发布时间】:2016-02-07 05:39:09
【问题描述】:

我是组装初学者。 我试图用 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

【问题讨论】:

标签: assembly stack warnings masm


【解决方案1】:

我找到了解决方案。 我们需要为堆栈段定义“组合类型”。

stk segment

应该是:

stk segment stack

唯一适用于堆栈段的组合类型是“堆栈”。

【讨论】:

  • 在 masm 中完美工作
【解决方案2】:
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' 带引号将类属性附加到 is。

ref2:引用a detailed explanationMargaret Bloom

STACK 与 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 2011-09-19
    相关资源
    最近更新 更多