风神翼龙 发表于 2014-5-18 11:45:43

关于栈、psp问题求助

assume cs:code ,ds:data ,ss:stack
data segment
      dw0123h ,0456h ,0789h ,0abch ,0defh ,0fedh ,0cbah ,0987h
data ends
stack segment
      dw0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0         1。 为什么程序加载完后(执行到mov sp ,14h),ds段的 前20个字节不全是0?
stack ends

2.不是说程序的物理地址是SA+10H:0吗?也就是说CS==SA+10H,而SA==DS,那么用debug的R命令查看时,为什么CS不等于DS+10H,而是等于DS+12H,倒是SS==DS+10H?

code segment
start: mov ax ,stack
      mov ss ,ax
      mov sp ,14h
      mov ax ,data
      mov ds ,ax
      mov bx ,0
      mov cx ,8
s:push
      add bx ,2
      loop s
   
      mov bx ,0
      mov cx ,8
s0:    pop
       add bx ,2

       loop s0

      mov ax ,4c00H
      int 21H
code   ends
end   start

传说。 发表于 2014-5-18 19:07:47


以我的为例 ds 075a,程序从076a 开始符合你 ds+10h的逻辑
076a:0 到后面16个字节存放的是你的data段数据
076a:10 到后面32个字节你已经设为栈段
所以程序从076d 开始
至于你的第一个问题。 由于个人内存使用情况不同是会出现不同现象。 我的就是都为0.





oggplay 发表于 2014-5-18 19:14:33

1、晕哦,你的ds是13FF,再说写的stack segment堆栈段没啥意思吧,push一下会更简单。
2、物理地址=段地址×10H+偏移地址。

风神翼龙 发表于 2014-5-18 22:04:40

oggplay 发表于 2014-5-18 19:14 static/image/common/back.gif
1、晕哦,你的ds是13FF,再说写的stack segment堆栈段没啥意思吧,push一下会更简单。
2、物理地址=段地址 ...

答非所问,物理地址=段地址X10H+偏移地址,我岂会不知?

风神翼龙 发表于 2014-5-18 22:08:04

传说。 发表于 2014-5-18 19:07 static/image/common/back.gif
以我的为例 ds 075a,程序从076a 开始符合你 ds+10h的逻辑
076a:0 到后面16个字节存放的是你的data段 ...

没道理啊,我不是把栈初始化为0了吗?

青玄 发表于 2014-5-19 18:17:26

恩恩!支持楼上的回答!由于内存使用情况的不同!内存中的数据是不一样的,至于另一个问题,我和传说。的观点是一样的。{:2_27:}

传说。 发表于 2014-5-20 19:21:28

风神翼龙 发表于 2014-5-18 22:08 static/image/common/back.gif
没道理啊,我不是把栈初始化为0了吗?

如果你你电脑中已经有程序用到了那一段内存你的操作没有用的。看起来改了而已。就像有的内存空间是只读的一样。你根本改不了。

www5956 发表于 2014-5-20 22:10:04

嗯和传说观点一模一样:loveliness:

黄种人 发表于 2014-6-27 14:19:03

回顾一下:titter:

↘_vIp`|家族_流 发表于 2014-7-10 19:39:58

楼主为什么是 sp指向14h不应该是23h吗

风神翼龙 发表于 2014-7-12 15:17:29

↘_vIp`|家族_流 发表于 2014-7-10 19:39
楼主为什么是 sp指向14h不应该是23h吗

dw0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0    ,栈空间为20个字节,偏移地址是0~13h,栈指针起初是要指向栈底的下一个单元的,即14h。指向23h不久严重越界了吗?

阔怀 发表于 2015-8-8 10:42:07

{:1_1:}

阔怀 发表于 2015-8-11 11:23:17

{:1_1:}
页: [1]
查看完整版本: 关于栈、psp问题求助