这个程序这样改为什么不行?

yerssa 2010-06-12 12:52:13
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指向的那两个字节入栈和出栈嘛,怎么我改后,程序运行到第三步,就终止了?
...全文
120 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
pc_boy_man 2010-06-14
  • 打赏
  • 举报
回复
pop cx 后面应加上 push cx

因为第一次pop cx 后 sp=2

而当第二次pop cx时 弹出的是偏移地址为sp=2的两个字节的数,

而这两个字节没放4, 这两个字节为0 当然。。。。。。。
wdl1127 2010-06-13
  • 打赏
  • 举报
回复
看不懂……
yerssa 2010-06-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nanlingcg 的回复:]
栈设小了!... ...不关程序的事,调试器原因.换个调试器调试...如:TD.
多用几个编译和调试器很有好处!
[/Quote]
哦??????是这样吗???
nanlingcg 2010-06-12
  • 打赏
  • 举报
回复
栈设小了!... ...不关程序的事,调试器原因.换个调试器调试...如:TD.
多用几个编译和调试器很有好处!


masmaster 2010-06-12
  • 打赏
  • 举报
回复
如果一个段中有内容的话,那么这个段最小占16个字节的空间,如果没有内容,那么占的空间为0个字节。因为你的程序需要使用栈段, 所以定义的最小空间是16字节, 而你定义的太小, 所以出错。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧