鱼C论坛

 找回密码
 立即注册
查看: 3908|回复: 5

[汇编作业] 关于栈、程序起始地址的两个困扰我的问题

[复制链接]
发表于 2014-5-15 23:28:28 | 显示全部楼层 |阅读模式
1鱼币
1.     stack segment
        dw  0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
        stack ends
用这种方法定义栈段,用debug调试,当用D命令查看栈中的内容时,为什么前20个字节不全是0?如下:

图片21.png

2.不是说程序是从SA+10H:0处开始的吗?也就是说cs应该等于SA+10H,而SA==DS,为什么下面的程序运行后是ss ==SA+10H ,CS==SA+12H?
assume cs:code ,ds:data ,ss:stack
data segment
      dw  0123h ,0456h ,0789h ,0abch ,0defh ,0fedh ,0cbah ,0987h
data ends
stack segment
      dw  0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
stack ends
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 [bx]
      add bx ,2
      loop s
   
      mov bx ,0
      mov cx ,8
s0:    pop [bx]
       add bx ,2
  
       loop s0

      mov ax ,4c00H
      int 21H
code   ends
end     start
图片1.png

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-26 23:48:58 | 显示全部楼层
朋友经过我的debug发现了点东西,首先(ds)=13ef ,所以程序的数据开始应该在ds+10h,即13ffh处开始,但13ffh开始放的并不是程序的入口,而是数据段和栈段的数据共需36个字节,即16进制的24h,注意(ss)=13ffh, (cs)=1402h表示的是段地址,实际地址还要乘16,即ss的实际地址是13ff0h,cs实际地址的14020h,总共相差30h个地址,那为什么要相差30h个地址呢?明明数据段和栈只用了24h个地址,其实那多出来的6h地址是为了方便能设置(ip)=0,如果在(cs)=(ds)+25h,那么ip的值就肯定不为0了,这是我的一点猜测
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-26 23:58:42 | 显示全部楼层
1. 第一個問題我也碰到過, 不過實際在使用的時候他不會給你出錯的

2.第二個問題, 你dw 20個字節, 您也知道, 每個段的偏移量是16, 所以20個字節要往前偏移2個段的最小單位, 也就是32個字節, 但是棧頂卻是在 CS:20, CS:21~CS:31這段都浪費了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-30 20:50:37 | 显示全部楼层
1. 栈,会记录一些寄存器的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-1 02:03:19 | 显示全部楼层
看书!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-8 10:43:41 | 显示全部楼层
不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-19 00:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表