欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

下头的程序实现依次用内存0:0-0:15单元中的内容改写程序中的数据,数据的传送用栈来进行,栈空间设置在程序内,有几个地方不是很清楚,请大家指点一下

更新时间: 2014-01-05 03:16:41 责任编辑: Author_N1

 

下面的程序实现依次用内存0:0-0:15单元中的内容改写程序中的数据,数据的传送用栈来进行,栈空间设置在程序内,有几个地方不是很清楚,请大家指点一下!
程序如下:
assume   cs:codesg
codesg   segment

   dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
   dw 0,0,0,0,0,0,0,0,0,0

   start: mov ax,cs
          mov ss,ax
          mov sp,26         ;这里为什么是26啊 感觉好像是24就可以了 但是不行

          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


我是个初学者希望大家能尽量说清楚一点谢谢了

--参考方法--
SP开始是24是!中间数据转换只需要用一个字来转换!所以LOOP那里SP的变化是从24到22之前变化!

然后退出循环后,使用了INT 21H 也就是中断!

进入中断处理器前还要保留现声场,同时要保护当前的标记位。所以还要用到栈。

而这里要保存的数据量有{ 当前CS段,INT 21H 的下一条指令的IP,当前标记寄存器的值} = 3*2字节。

也就是上面SP从24跳到 24-3*2 = 18 这个位了,就进入INT 21H这里啦!也就是退出程序啦。

再计算一下,sp=18这里并没有来到
 dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
  dw 0,0,0,0,0,0,0,0,0,0
的0987h这个位置,0987这个位置刚刚好是 0eh

所以总的来讲,程序是从0:0-0:15读出了16字节的数据,并存放到:
 dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
这16字节的地方中。

也就是MOV SP 24也是可行的!

LZ :"貌似24个运行出来不能10个字单元" 是什么意思 ?

LZ还要保留这10个0吗? 这10个0不是LZ用来做栈空间的吗?
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 03:16:41
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/20313/
本文WWW.DOC100.NET DOC100.NET版权所有。