汇编初级问题(有关栈的分配)

etmonitor etmonitor 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,数据的传送用栈来进行。栈空间设置在程序内。完成程序:

assume cs:codesg
codesg segment

dw 0123H, 0456H, 0789H, 0abcH, 0defH, 0135H, 0246H, 0369H
dw 0,0,0,0,0 ;5个字单元用作栈空间

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, 0135H, 0246H, 0369H
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

debug可以完成功能。

但是我有一个疑问:
为什么要用5个字单元做栈空间??
用4个字作栈空间,程序改为:
……
dw 0,0,0,0
……
mov sp,24
……
我试了也完全可以实现功能。

那现在就又有一个问题:我认为程序中只需要一个字的栈空间作中转就可以实现数据的互换,为什么要设4个字的栈空间呢?

但是如果我把程序改为
……
dw 0,0,0
……
mov sp,22
……
(用三个字作栈空间)
得到的结果是最后的一个字的内容没有改变。

改为:
……
dw 0,0
……
mov sp,20
……
(用两个字作栈空间)
得到的结果是最后的两个字的内容没有改变。

……
dw 0
……
mov sp,18
……
(用一个字作栈空间)

得到的结果是最后的三个字的内容没有改变。
你可以试试。;)

为什么????


多谢!!
...全文
评论 8
收藏 已收藏
分享
返回顶部
etmonitor
汇编语言 21,500 成员 41,619 内容