嵌入式之家

 找回密码
 现在注册

QQ登录

只需一步,快速开始

搜索
热搜: ARM cortex
查看: 2946|回复: 4

栈段

[复制链接]

该用户从未签到

55

主题

168

帖子

1767

积分

金牌会员

Rank: 6Rank: 6

积分
1767
发表于 2016-1-11 09:59:37 | 显示全部楼层 |阅读模式
      一、对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段,我们可以讲长度为N(N<=64KB)的一组地址连续、起始地址为16的倍数的内存单元,当做栈空间来用,从而定义了一个栈段。比如,我们将10010H~1001FH这段长度为16字节的内存空间当做栈来用,以栈的方式进行访问。这段空间就可以称为一个栈段,段地址为1001H,大小为16字节。
    将一段内存当做栈段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排,就在执行PUSH,POP等栈操作指令时自动的将我们定义的栈段当做栈空间来访问。如何使得如PUSH,POP等栈操作指令访问我们定义的栈段呢?就是要将SS:SP指向我们定义的栈段。
   二、一个栈段最大可以设为多少,为什么?
    这个问题显而易见,提出来只是为了提示我们将相关的知识融会起来。首先从栈操作指令所完成的功能的角度上来看,PUSH、POP等指令在执行的时候只修改SP,所以栈顶的变化范围是0~FFFFH,从栈空时候的SP=0,一直压栈,直到栈满时SP=0;如果再次压栈,栈顶将环绕。覆盖了原来栈中的内容,所以一个栈段的容量最大为64KB。
   三、段的综述
     我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元,这完全是我们自己的安排。
     我们可以用一个段存放数据,将它定义为“数据段”;
     我们可以用一个段存放代码,将它定义为“代码段”;
     我们可以用一个段当做栈,将它定义为“栈段”。
     我们可以这样安排,但若要让CPU按照我们的安排来访问这些段,就要:
     对于数据段,将它的段地址放在DS中,用mov、add、sub等访问内存单元的指令时,CPU就把我们定义的数据段中的内容当做数据来访问;
     对于代码段,将它的段地址放在CS中,将段中第一条指令的偏移地址放在IP中,这样CPU就执行我们定义的代码段中的指令;
     对于栈段,将它的段地址放在SS中,将栈顶单元的偏移地址放在SP中,这样CPU在需要操作的饿时候,比如执行PUSH、POP指令等,就将我们定义的栈段当做栈空间来用。
    可见,不管我们如何安排,CPU将内存中的某段内容当做代码,是因CS:IP指向了那里,将段内存当做栈,是因为SS:SP指向了那里。我们一定要清楚,什么是我们的安排,以及如何让CPU按我们的安排行事。
回复

使用道具 举报

该用户从未签到

45

主题

115

帖子

1543

积分

金牌会员

Rank: 6Rank: 6

积分
1543
发表于 2016-1-11 13:33:59 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

1

主题

50

帖子

222

积分

版主

Rank: 7Rank: 7Rank: 7

积分
222
发表于 2016-1-11 19:21:17 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

55

主题

168

帖子

1767

积分

金牌会员

Rank: 6Rank: 6

积分
1767
 楼主| 发表于 2016-1-11 19:59:32 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

32

主题

81

帖子

771

积分

高级会员

Rank: 4

积分
771
发表于 2016-2-24 22:45:15 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 现在注册

本版积分规则

QQ|Archiver|手机版|小黑屋|嵌入式之家 ( 京ICP备14038168号-1 )

GMT+8, 2025-5-1 19:12 , Processed in 0.021824 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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