题目要求:
下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,数据的传送用栈来进行。栈空间设置在程序内,完成程序:
assume cs:codesg
codesg segment
dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
dw 0,0,0,0,0
start: mov ax,___
mov ss,ax
mov sp,___
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s: push [bx]
_________
add bx,2
loop s
mov ax,4c00H
int 21H
codesg ends
end start
我写出的第一个程序为:
assume cs:codesg
codesg segment
dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
dw 0,0,0,0,0
start: mov ax,cs
mov ss,ax
mov sp,26
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s: push [bx]
pop cs:[bx]
add bx,2
loop s
mov ax,4c00H
int 21H
codesg ends
end start
程序的运行结果如下图:
从上图可以看出,程序只在第一次循环时实现数据传送。这是为什么呢?还有一个问题让我不解,某个网友给出的参考答案跟我的答案是一致的。换言之,该网友使用上述源代码在其电脑上实现了程序预期的功能。难道问题出在我的电脑上,而不是我所写的源代码?
在我看来,初时ss:sp指向栈底,push [bx]指令让一个字的数据入栈,pop [bx]指令让一个字的数据出栈。这样一进一出,也就是循环一次后,ss:sp依然指向栈底。根据这种思路,栈空间的大小为一个字就足够了。根据这种思路,我将程序修改如下:
assume cs:codesg
codesg segment
dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
dw 0
start: mov ax,cs
mov ss,ax
mov sp,18
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s: push [bx]
pop cs:[bx]
add bx,2
loop s
mov ax,4c00H
int 21H
codesg ends
end start
程序的运行结果如下图:
从上图可以看出,我的思路有误。
以上问题,敬请高手指教,小弟不胜感激!