VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3971|回复: 25

关于堆栈段SS寄存器的问题。

[复制链接]

2

主题

18

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-2-6 14:30:01 | 显示全部楼层 |阅读模式
SS被成为堆栈段寄存器,用于存放堆栈段的基值。堆栈段基地址是指栈底(高地址)还是栈顶(低地址)?
回复

使用道具 举报

0

主题

23

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
发表于 2020-3-29 17:45:01 | 显示全部楼层
一般都是指向高地址吧, 除非想实现些特殊功能
回复

使用道具 举报

2

主题

18

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
 楼主| 发表于 2020-4-2 16:30:02 | 显示全部楼层
在《自己动手写操作系统中》有如下一段程序:

%include        "pm.inc"        ; 常量, 宏, 以及一些说明

              ORG       0100H
              JMP       LABEL_BEGIN

[SECTION .gdt]
; GDT
LABEL_GDT:                Descriptor          0,                0, 0     LABEL_DESC_CODE32:                 Descriptor          0, SegCode32Len - 1, DA_C + DA_32       
LABEL_DESC_VIDEO:                 Descriptor         0B8000h,           0ffffh, DA_DRW               
; GDT 结束

      GDTLEN  EQU       $ - LABEL_GDT           ; GDT长度
      GDTPTR  DW        GDTLEN - 1  ; GDT界限
              DD        0           ; GDT基地址

; GDT 选择子
          SELECTORCODE32  EQU       LABEL_DESC_CODE32        - LABEL_GDT
           SELECTORVIDEO  EQU       LABEL_DESC_VIDEO        - LABEL_GDT
; END of [SECTION .gdt]

[SECTION .s16]
[BITS        16]
            LABEL_BEGIN:
              MOV       AX, CS
              MOV       DS, AX
              MOV       ES, AX
              MOV       SS, AX
              MOV       SP, 0100H

程序执行到:MOV       AX, CS处,CS似乎应该是0。因为CPU初始化后CS就是0,上面的程序似乎对CS并未做过修改。(除非“ORG       0100H”它能初始化CS为0100H,否则就是0),“MOV       SS, AX”则把CS的值给了SS,似乎SS也是零,但在我的印象中SS好像应该指向栈底(高地址),可它却指向了低地址。“MOV       SP, 0100H”没有问题,但似乎在程序开始时SS与SP指向一致的栈底0100H似乎更为妥当。

请高手门指点一二!
回复

使用道具 举报

0

主题

23

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
发表于 2020-4-4 23:00:02 | 显示全部楼层
SS? 它哪里有高地址还是低地址的说法? 高地址还是低地址是对 SP 来说的. SS, 作为段寄存器, 当然只能是指向段的开头了
回复

使用道具 举报

2

主题

18

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
 楼主| 发表于 2020-4-8 00:15:01 | 显示全部楼层
堆栈是有栈底栈顶之分的,SS左移四位后是堆栈段的基地址,堆栈段的基地址是堆栈段的栈顶还是栈底?
回复

使用道具 举报

0

主题

23

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
发表于 2020-4-9 16:45:02 | 显示全部楼层
这个, 你想乱了吧. 完整的地址是 "段址:偏移" 综合实现的. 你觉得段址可能指向栈底吗? 如果可能的话, 通过怎样的偏移来标示栈顶?
回复

使用道具 举报

2

主题

18

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
 楼主| 发表于 2020-4-12 11:00:01 | 显示全部楼层
我自己的感觉是整个的堆栈段是一个堆栈,所以SS定位于堆栈的一端,通过SP偏移,可以访问到堆栈的任意位置。虽然是SS:SP共同寻址,但SP为0时,就变成了SS单独寻址,难到SP为0时,SS不指向堆栈的任何位置,而只是指向堆栈段的开始,那堆栈段的开始既不是栈底,又不是栈顶,那它是何处呢?
回复

使用道具 举报

2

主题

18

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
 楼主| 发表于 2020-7-16 19:15:01 | 显示全部楼层
我认为SS左移四位后指向堆栈段基地址(堆栈的栈顶)。SP初始为堆栈段的大小,从而使SS:SP定位到栈底(堆栈段的高地址)。
回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-7-17 11:00:01 | 显示全部楼层
ss 堆栈段是指向堆栈的栈低的。大部分情况下它是指向高地址,但是也有一些情况时指向低地址的,这取决于不同的体系结构,换句话说就是当ss指向高地址时入栈 减sp出栈 增加 sp 而ss指向低地址时,入栈增加 sp 出栈则减sp

我是初学者,说的不对请指正
回复

使用道具 举报

2

主题

18

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
 楼主| 发表于 2020-7-21 23:45:02 | 显示全部楼层
据我所知,在实模式在,SS:SP共同寻址堆栈段,如此一来,寻址范围就是SS*16+0~SS*16+SP,SS*16是堆栈段的基地址。假设CPU是80X86系列,这种CPU用堆栈段的高地址作为栈底,也就是说SS*16应该是堆栈的栈顶(低地址),堆栈为空时,SP指向栈底,也就是说,SP应该指向堆栈段的末尾才对,不知道我的推理对不对?
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

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