王爽的汇编题,检测点6.1

jjyjjyjjy 2004-05-04 12:18:51
用内存0-15的单元中内容改写程序的数据,用栈实现。
assume cs:codeseg
codeseg 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
codeseg ends
end start
一步步执行查看,数据确实被内存的0-15的数据改写了,但执行了完了后为什么只有
程序中的第一个数据被正确改写,其它的都不对?会的请帮忙看看,谢谢。

...全文
239 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
benlar 2004-05-05
  • 打赏
  • 举报
回复
将mov sp,26
改为:
mov sp,260
后就不会又问题吗?这样是可以使堆栈不覆盖数据区了,但是改为260后就不会覆盖其他有用数据吗?

这样说是不负责任的!

指令“int 21”的执行要用栈,在本题中"int 21"用的栈空间超过了5个字,因此覆盖了前面的数据。

本题意图可能是 让读者跟踪到“int 21h”之前,看到“内存0-15的单元中内容改写程序的数据”就完了,写“mov ax,4c00h”和“int 21h”只是为了程序的完整性。





jjyjjyjjy 2004-05-05
  • 打赏
  • 举报
回复
谢谢benlar(登) ,谢谢大家!
csdsjkk 2004-05-04
  • 打赏
  • 举报
回复
mov sp,26
改为:
mov sp,260
jjyjjyjjy 2004-05-04
  • 打赏
  • 举报
回复
首先我谢谢csdsjkk(),改了以后确实可以了,但这个题目要求把栈设在程序内(对不起,这点我忘写了),改成260不是不在程序分配的内存里面了?
csdsjkk 2004-05-04
  • 打赏
  • 举报
回复
这个“260”没有任何意思,
程序本身的问题是指令‘mov sp,26’使堆栈设在了数据区,
int21调用会导致堆栈覆盖数据区,
解决的方法是使堆栈远离数据区,sp 改为260,2600,26000均可
cnd2004 2004-05-04
  • 打赏
  • 举报
回复
能解释一下么,
那个260是什么意思
XmagicX 2004-05-04
  • 打赏
  • 举报
回复
解决了
  • 打赏
  • 举报
回复
csdsjkk() 真厉害我在作的时候也出现同样的问题,按他的改了后就没问题了
同时也要谢谢jjyjjyjjy (Jack jiang)

21,459

社区成员

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

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