鱼C论坛

 找回密码
 立即注册
查看: 1875|回复: 8

程序6.4关于sp指向问题的小疑问

[复制链接]
发表于 2014-3-27 14:16:19 | 显示全部楼层 |阅读模式
2鱼币
{X$KEVF10[EFW3]B4AAF]1A.jpg 如果数据都定义在一个段中 无data和stack段的话sp指向30h(也就是程序6.3),但是分开成多段的话sp却指的是20h,也就是说data段中的8个字,不参与stack段sp指向栈底的工作了 这是什么原因?看了小甲鱼的030 第六章 包含多个段的程序02 中间也没有对这问题的解释

最佳答案

查看完整内容

其实你的程序是合适的如果分段的话,sp指向的是20h因为因为stack段要被初始化,所以它的指针要指向栈底,你的stack段是32个字节也就是0~31指向栈底的话就是sp->32; 如果不分段的话,就是30h,也就是48个字节:0~47,指针指向栈底的话就是30h了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-27 14:16:20 | 显示全部楼层
其实你的程序是合适的如果分段的话,sp指向的是20h因为因为stack段要被初始化,所以它的指针要指向栈底,你的stack段是32个字节也就是0~31指向栈底的话就是sp->32;
如果不分段的话,就是30h,也就是48个字节:0~47,指针指向栈底的话就是30h了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-27 20:41:23 | 显示全部楼层
段地址是在data段后面 总共的段空间为20H 是从 10H到30H 这段空间
要是30h 那就得设置 mov ax,data  mov ss,ax mov sp,30h
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-27 21:26:43 | 显示全部楼层
其实这个程序不是这样的,这个程序的意思就是要把上面的8个字型数据逆序过来并存放,用来说明栈先进后出的特性,其实是这样的:

codesg segment
    dw 0123H, 0456H, 0789H, 0abcH, 0fedH, 0cbaH, 0987H
        dw 0, 0, 0, 0, 0, 0, 0, 0    ;定义8个字型数据,将存放前面的8个数
       
start: mov ax, cs
       mov ss, ax
           mov sp, 32     ; 这里的意思是:嗯....,本来嘛!先定义了8个字型数据也就是16个字节
           mov bx, 0      ;后面又定义了8个字的内存空间还是16个字节这样的话,也就总共0~31个字节
           mov cx, 8      ;因为cs:16~cs:31要当做栈来使用,所以要初始化栈为空,所以sp要指向
                          ;栈底,也就是指向cs:32
         s:push cs:[bx]
           add bx, 2
           loop s
          
           mov bx, 0
           mov cx, 8
          
         s0:pop cs:[bx]
            add bx, 2
                loop s0
                mov ax, 4c00h
                int 21h
codesg ends
end start


你上面的那个程序中的20,和初始化栈空间,我是真没看懂是啥意思!

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

使用道具 举报

发表于 2014-3-27 21:31:15 From FishC Mobile | 显示全部楼层
你数数stack segment 几个dw ,总共几个字节,然后换算成16进制是多少 结合栈的工作机制应该明白了 不懂?复习!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-27 21:43:23 | 显示全部楼层

恩 我上面的那个程序确实是实现了把8个字型数据逆序存放;但是你没有看清我给的程序(你给的程序和书上的程序 6.3是一样的),我给的程序是多个段;其次 我上面给的那个程序就是《汇编语言》王爽 一书中的( 程序6.4)你可以看一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-27 22:04:13 | 显示全部楼层
steven20133 发表于 2014-3-27 20:41
段地址是在data段后面 总共的段空间为20H 是从 10H到30H 这段空间
要是30h 那就得设置 mov ax,data  mov s ...

我有一点懂了,也就是是说 :(以上面那个程序为例)一个程序包含了几个段,那么她的数据段和栈段数据之间的偏移地址还是相连的,但是互不影响  如果stack dw 0,0,0,0,0,0,0,0 那么就是mov sp,10h
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-27 22:23:32 | 显示全部楼层
oggplay 发表于 2014-3-27 21:31
你数数stack segment 几个dw ,总共几个字节,然后换算成16进制是多少 结合栈的工作机制应该明白了 不懂?复 ...

恩 也就是说sp她只管这程序的stack段定义了几个。然后根据stack段数据的多少个来指定sp指向栈底的的数据 , 而data段定义了多少数据 在多段程序中 他是不管的  是这个意思吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-29 07:57:16 | 显示全部楼层
你看到 STACK 这个段了吗?
里面空出了32字节的 0 用来做栈段,dw定义双字,一共有16个0,又因为一个字是2个字节,2*16=32 就是这样算的。32是10进制数字,转换成16进制是 20H,所以,SS指向STACK,SP=20H
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-23 22:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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