汇编中用db 初始化栈中数据,运行结果与预期不符

代码如下:

assume ss:stack,cs:code

stack segment stack
     db 41h,10b,41h,10b,41h,10b,41h,10b,41h,10b
stack ends

code segment
    start:
    mov ax,stack
    mov ss,ax
    mov sp,0000h
    mov ax,0b800h
    mov es,ax

    mov cx,5h
    mov bx,0h
    s:
    pop es:[0820h+bx]
    add bx,2
    loop s

    mov ax,4c00h
    int 21h
code ends
end start

我希望它能把栈中的5个A显示出来,但失败了,实际结果如图:
图片说明
P.S. 使用masm5 编译,在VirtualBox上创建的DOS7 虚拟机上运行。

把”stack segment stack“的后面的那个stack去掉。

刚刚debug了一下发现大概是这样的情况,

1.首先如果是“stack segment stack”
那么就是在连接时就把stack当栈段了。
这个时候不用写assum ss:stack,mov ss,ax,mov sp,0h之类的初始化操作。
2.如果是“stack segment”
那么是在程序执行时才将stack段设置为栈段
那么就要写那些assum之类的初始化操作了。

程序启动是需要用到栈段的(调用程序时需要call呀)
如果是第二中情况,启动程序时用到的是系统给分配的栈段(默认程序不设置栈段就将程序不足64kb的地方作为栈段),然后程序开始后再将sp指向stack段,这种情况一切正常。
如果是第一种情况,启动程序时用到的就是我们自己指定的栈段(就是那5个‘A’),那么一用到就把初始值给覆盖了,所以你看不到正确的结果。我试了下可以把栈段设置的大一点(记得要设置为偶数字节),让启动程序使用了栈段也覆盖不到最前面那5个‘A’那一段。