Keil C51堆栈的起始地址?STACK 怎么确定?
KeilC51堆栈的起始地址?STACK怎么确定?8051单片机硬件复位后SP是指向07H,但是keil环境中编译链接的工程在keil的启动文件中SP被设置成#?STAC...
Keil C51堆栈的起始地址?STACK 怎么确定?
8051单片机硬件复位后SP是指向07H,但是keil环境中编译链接的工程在keil的启动文件中SP被设置成#?STACK-1,那么?STACK 的值怎么确定? 展开
8051单片机硬件复位后SP是指向07H,但是keil环境中编译链接的工程在keil的启动文件中SP被设置成#?STACK-1,那么?STACK 的值怎么确定? 展开
2个回答
2020-05-11
展开全部
从下面可以看出
-------- 类型-----基地址-----长度-----定位方式-----段名
------------------------- 数据 空间 -------------------------
----寄存器----0000H----0008H----绝对----"工作一组"
----寄存器----0008H ----0008H----绝对----"工作二组
---------------0010H----0010H------------*** 没用使用的的三/四组***
----BIT----0020H.0----0000H.1----UNIT ----I区里的Bit位区,在main里
----0020H.1----0000H.7 ----------------*** 一个字节里只用的1个位,另外7个位空出来了***
----DATA----0021H----002FH----UNIT ----局部变量占用(函数内变量占用的ram)
----DATA----0050H----002BH----UNIT----00-7fH的RAM占用 在main里,全局变量
----IDATA----007BH----0022H----UNIT----80到ff的ram占用 在main里,全局变量
----IDATA----009DH----0001H----UNIT ----?STACK这里就是栈底的位置了
(关于*.M51文件的打开,可以在工作文件夹里找,也可以双击工程窗口里的工程名称来打开)
D区00-7f = I区00-7f 可以直接寻址或间接寻址
D区80-8f:是SFT区,只能直接寻址
I区80-8f:是通用DATA-ram 只能间接寻址。
00-1f的32们字节,是I区,也是D区,是4个8字节的寄存器工作组。C51只用了前16个,也就是前两组,具体用的是那一组,由psw的RS位的状态来定。
MOV SP,#?STACK-1
sp = 9dh-1 = 9c
这里有个问题9c:33 9b:44 ,这里栈顶是3344h的pc指针,同样也是全局变量的最后两个字节,而进入mian函数时,这个3344h不会用来给pc赋值,
比如从main跳向sub,当前的pc = c:0x68e,那么就会增加一个栈层,sp = 9eh
9e = 06h,9d = 8e;
当sub返回时,pc 从sub的位置C:9adh回到68e就好了
-------- 类型-----基地址-----长度-----定位方式-----段名
------------------------- 数据 空间 -------------------------
----寄存器----0000H----0008H----绝对----"工作一组"
----寄存器----0008H ----0008H----绝对----"工作二组
---------------0010H----0010H------------*** 没用使用的的三/四组***
----BIT----0020H.0----0000H.1----UNIT ----I区里的Bit位区,在main里
----0020H.1----0000H.7 ----------------*** 一个字节里只用的1个位,另外7个位空出来了***
----DATA----0021H----002FH----UNIT ----局部变量占用(函数内变量占用的ram)
----DATA----0050H----002BH----UNIT----00-7fH的RAM占用 在main里,全局变量
----IDATA----007BH----0022H----UNIT----80到ff的ram占用 在main里,全局变量
----IDATA----009DH----0001H----UNIT ----?STACK这里就是栈底的位置了
(关于*.M51文件的打开,可以在工作文件夹里找,也可以双击工程窗口里的工程名称来打开)
D区00-7f = I区00-7f 可以直接寻址或间接寻址
D区80-8f:是SFT区,只能直接寻址
I区80-8f:是通用DATA-ram 只能间接寻址。
00-1f的32们字节,是I区,也是D区,是4个8字节的寄存器工作组。C51只用了前16个,也就是前两组,具体用的是那一组,由psw的RS位的状态来定。
MOV SP,#?STACK-1
sp = 9dh-1 = 9c
这里有个问题9c:33 9b:44 ,这里栈顶是3344h的pc指针,同样也是全局变量的最后两个字节,而进入mian函数时,这个3344h不会用来给pc赋值,
比如从main跳向sub,当前的pc = c:0x68e,那么就会增加一个栈层,sp = 9eh
9e = 06h,9d = 8e;
当sub返回时,pc 从sub的位置C:9adh回到68e就好了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
编译器根据你程序代码中使用内存的多少自动设定堆栈的大小。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询