逆序存放出错

r00t 2010-01-15 10:57:27

assume ds:datasg, ss:stacksg, cs:codesg

datasg segment

dw 1122H, 3344H, 5566H, 7788H, 9900H

dw 0, 0, 0, 0, 0

datasg ends

stacksg segment

dw 0, 0, 0, 0, 0

stacksg ends

codesg segment

start: mov ax, datasg
mov ds, ax

mov ax, stacksg
mov ss, ax

mov bx, 10
mov sp, bx

mov bx, 0

mov cx, 5
s0: push [bx]
add bx, 2
loop s0

mov cx, 5
s1: pop [bx]
add bx, 2
loop s1

mov ax, 4C00H
int 21H

codesg ends

end start




用debug单步调试的时候,在执行S0循环第四次的时候出错。
请前辈指点!
谢谢!
...全文
100 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2010-01-15
  • 打赏
  • 举报
回复
debug调试时,如果在sp接近于0时中断,会产生跨段异常。把堆栈设置大一些。
BAYNPU 2010-01-15
  • 打赏
  • 举报
回复
上面的源程序可能是王爽老师的例题吧。
大熊猫侯佩 2010-01-15
  • 打赏
  • 举报
回复
如上,建议预留够stack空间。
zara 2010-01-15
  • 打赏
  • 举报
回复
堆栈留得太小了。对简单的程序,要么不要设置堆栈,虽然在链接时会有个 Warning 性质的提示;要么就给大点儿,至少往 64 或 128 bytes 上吧。要考虑具体的使用到的堆栈的大小,就要考虑可能发生的各种对堆栈的使用,初涉汇编不建议为这个耗费。

说实话,不少次看到类似的问题了。真不明白这样的代码是从哪里来的,哪个××留下的这样的问题/陷阱?!
(1)用带表头的链表存放输入的数据,每读入一个数,按升插入到链表中,链表中允许两个结点有相同值。链表的头结点存放链表后面的结点个数,初始化时就生成头结点(初值为0)。链表翻转是把数据(变成降),注意,头结点不动。翻转后要再翻转一次,恢复升后才能插入新元素,否则会出错。 (2)先定义堆栈的几个基本操作,再设计一主函数利用堆的操作完成以下功能:假设一个算术表达式中可以包含三种括号:()[]{},且这三种括号可以按任意次嵌套使用(如:...[...{...}...[...]...]...(...))。编写判别给定表达式中所含括号是否正确配对出现的算法,已知表达式已存入数据元素为字符的单链表中。 (3)先定义队列的几个基本操作,再设计一主函数利用队列的操作完成以下功能:键盘输入的字符可以临时存入键盘的缓冲区中。为了充分利用缓冲区的空间,往往将缓冲区设计成链式循环队列的结构,并为循环队列结构的缓冲区设置一个队首指针和一个队尾指针。每输入一个字符到缓冲区中,就将尾指针后移,链入缓冲区的循环队列之中;每输出一个字符号,就将队头指针前移,将它从缓冲队列中删除。假设有两个进程同时存在于一个应用程中,第一个进程连续在屏幕上显示字符“X”,第二个进程不断检查键盘上是否有输入,若有则读入用户键入的字符,将其保存到键盘缓冲区中。

21,459

社区成员

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

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