看到有人说 因为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 亦可作为堆栈区使用。