这两天看一段程序,遇到52堆栈的问题

看到有人说  因为52高128B Indirect RAM 可以间接寻址,所以可用作堆栈

又看到老古开发网的一个老帖:


         MOV SP,#80H;栈底!!!!!太过分啦吧!
51只有128(7FH)的RAM(52的高128不能做栈),你栈底就设到80H?
80H是P0口的地址,一有数据进栈,P0口能保留数据就神啦。********************* 

这是01单片机论坛的斑竹:光明使者"给我的说明现在问题解决了,
真是惭愧,也不知当时设置的时候是怎么想的,出现问题时在也没看过
这些设置,总是觉得主程序有问题,被斑竹一语道破,足以见得斑竹深厚扎实的
基础,希望大家引以为戒,另外,用C51的那个人,不要瞧不起别人
你都”稀了”干嘛不做点“干”事?照样没看出问题,

http://www.laogu.com/laogubbs/vbbs_23659.htm

 

说是不能用

 

但是下面这段是我从一个DS520的程序中反汇编出来,是主程序初始化中的一段,系统正常运行:

MOV   R0,#7FH  
CLR   A        
MOV   @R0,A    
DJNZ  R0,1305H 
MOV   SP,#AFH  
LJMP  Label_X1     
               
CLR   EA       
MOV   SFR_TA,#AAH 
MOV   SFR_TA,#55H 
ANL   SFR_WDCON,#FDH 

 

所以,52系列是可以用高128B作为堆栈的

并且应该不是用直接寻址的SFR区

 

因为上面这段程序中的堆栈是从B0H开始的,但是此程序使用了P3(B0H)和IP(B1H)这两个SFR,出入堆栈操作并不影响这两个寄存器

另外,AT89S52 Hardware Control 中这段文字也证明了这一点

The address register for 8-bit addresses can be R0 or R1 of the selected register bank,
or the Stack Pointer. The address register for 16-bit addresses can only be the 16-bit
“data pointer” register, DPTR.

深圳凌燕翻译的AT89S52手册也有一段:

·数据存储器:
AT89C52 有256 个字节的内部RAM,80H-FFH 高128 个字节与特殊功能寄存器(SFR)地址是重叠的,也就是高128
字节的RAM 和特殊功能寄存器的地址是相同的,但物理上它们是分开的。
当一条指令访问7FH 以上的内部地址单元时,指令中使用的寻址方式是不同的,也即寻址方式决定是访问高128 字节
RAM 还是访问特殊功能寄存器。如果指令是直接寻址方式则为访问特殊功能寄存器。
例如,下面的直接寻址指令访问特殊功能寄存器0A0H(即P2 口)地址单元。
MOV 0A0H,#data
间接寻址指令访问高128 字节RAM,例如,下面的间接寻址指令中,R0 的内容为0A0H,则访问数据字节地址为0A0H,
而不是P2 口(0A0H)。
MOV @R0,#data
堆栈操作也是间接寻址方式,所以,高128 位数据RAM 亦可作为堆栈区使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值