assume cs:codesg,ss:stacksg,ds:datasg
stacksg segment
dw 0,0,0,0,0,0,0,0 这里改成一个0
stacksg ends
datasg segment
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
datasg ends
codesg segment
start:
mov ax,stacksg
mov ss,ax
mov sp,16 这里改成2
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s0:
push cx
mov si,0
mov cx,4
s:
mov al,[bx+3+si]
and al,11011111b
mov [bx+3+si],al
inc si
loop s
add bx,16
pop cx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
这程序不是始终在重复的使用SP指向的那两个字节入栈和出栈嘛,怎么我改后,程序运行到第三步,就终止了?
------解决方案--------------------------------------------------------
如果一个段中有内容的话,那么这个段最小占16个字节的空间,如果没有内容,那么占的空间为0个字节。因为你的程序需要使用栈段, 所以定义的最小空间是16字节, 而你定义的太小, 所以出错。
------解决方案--------------------------------------------------------
栈设小了!... ...不关程序的事,调试器原因.换个调试器调试...如:TD.
多用几个编译和调试器很有好处!
------解决方案--------------------------------------------------------
pop cx 后面应加上 push cx
因为第一次pop cx 后 sp=2
而当第二次pop cx时 弹出的是偏移地址为sp=2的两个字节的数,
而这两个字节没放4, 这两个字节为0 当然。。。。。。。