请大家帮忙分析一下

王鲲彩 2006-10-31 01:49:14
stack segment stack
db 16 dup (0)
stack ends

code segment
assume cs:code,ss:stack
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,0f0eh
mov cx,8
cyc: push ax
sub ax,0202h
loop cyc

mov sp,2 //就从这里开始
pop dx
pop dx //最奇怪的地方

mov ax,4c00h
int 21h
code ends

end start

对于以上代码编译后在DEBUG上进行单步跟踪,碰到了以下问题:
1)当我跟踪执行到修改SP后,使用 “D SS:0 F”命令查看堆栈发现物理栈顶到当前栈顶的数据被破坏,想不通为何会有这种情况,是DEBUG破坏的,还是DOS破坏的亦或是CPU对于堆栈操作存在的问题?
2)更令我不解的是当跟踪执行到第二条“POP DX”后,竟然CS也被改掉了,致使MOV AX,4C00H跟踪不到!
我真是想不通,难道在汇编级的堆栈操作有很多讲究之处?希望大家能帮忙分析一下。谢了先!
...全文
146 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
王鲲彩 2006-11-02
  • 打赏
  • 举报
回复
谢谢mydo与qtext
王鲲彩 2006-11-01
  • 打赏
  • 举报
回复
谢谢楼上的回复,对于汇编的一般使用的确不会出现我所说的情况。
但是由于我对于机器及系统底层很感兴趣,因此经常会将汇编程序置于某种极端的情况,比如上面的手动修改SP的情形,通过它来看看存储内容的变化,由此来一窥系统底层的情形。
我非常希望有和我同样兴趣的大侠,进来指点一下,非常感谢!
qtext 2006-11-01
  • 打赏
  • 举报
回复
debug 的int3 可能要使用用户栈,所以会看到栈区有一些"数据",不过用户栈有自已的指针,不影响。

执行 mov sp,2,后栈区已没什么空间了(2字节空间),但int3 还要使用一定的空间,造成数据或代码破坏
你可作如下测试 栈区定义为256,mov sp,2 改为 mov sp,240,这样就不会出错了。
大熊猫侯佩 2006-10-31
  • 打赏
  • 举报
回复
stack is too small ,you don't set stack by yourself.

code segment
assume cs:code,ss:stack
start:mov ax,stack
mov ss,ax
mov sp,256
mov ax,0f0eh
mov cx,8
cyc:push ax
sub ax,0202h
loop cyc

;mov sp,2
pop dx
pop dx

mov ax,4c00h
int 21h
code ends

end start

microyzy 2006-10-31
  • 打赏
  • 举报
回复
不懂,也许是debug的兼容问题,直接执行是可以的

21,459

社区成员

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

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