代码如下:
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’那一段。