STC32F12K54汇编问题
STC32F12K54-QFP48芯片,编译器KEIL-C251 V5.60,编译器配置截图,编译产生代码量30K左右,设计用到XDATA区间,目前碰到下面几个问题,麻烦看下怎么解决,谢谢!问题1):汇编代码头部包含头文件"STC32G.INC",使用下面的代码,编译时会出"warning A88: VALUE HAS BEEN TRUNCATED TO 16 BITS";
ORL P_SW2,#80H
MOV DPTR,#P0PU
MOV A,#0FFH
MOVX@DPTR,A
ANL P_SW2,#7FH
查看INC文件,把"P0PUEQU07EFE10H",改"P0PUEQU0FE10H",编译不报警,好像也不影响运行,(((想问下,这样改会不会影响什么?)))
问题2):堆栈问题
手册89页位置,有个例子代码,通过MOVSPX,#0100H设置堆栈指针初始值,但手册上面,查不到SPX这个寄存器的说明,只说堆栈在EDATA区域,能说下堆栈指针怎么使用吗?(汇编方式)
目前,采用“MOV SP,#0C1H",通过KEIL-DEBUG查看SPX=00C1H,此时代码上面,调用子程序初始化区间XRAM,子程序返回时,会造成错乱(查看DEBUG信息,发现SPX变成0000),
此时,改成初始化,则DEBUG及实际上板都能正常,
(((问下,手册不是说堆栈在EDATA区间,XRAM与EDATA是物理分开的吗,现在用MOVX @DPTR,A初始化这些为什么会造成在EDATA的堆栈被覆盖?)))
(((有没有什么代码,可以把EDATA与XRAM物理隔开?)))
以下2种方式测试都会错乱:
1)把”MOV SP,#0C1H"换成"MOV SPX,#1000H",在初始化时也会错乱,
2)采用"MOV SP,#0C1H",改初始化,也会错乱;
我的这个帖子或许对你有帮助
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=3615 MOV DPTR,#P0PU改为MOV DPTR,#WORD0 P0PU就不会报警了,SPX是C251的内置寄存器,属于寄存器DR60的别名,程序中也可用DR60代替 不过只用DPTR访问不了XFR寄存器,还要结合DPXL才行,都用STC32了,肯定要使用DR0-DR28寄存器来访问XFR了 问题1:扩展寄存器设置可参考STC32G实验箱例程包里面的汇编例子,如:
ORL P_SW2,#080H ;使能访问XFR
MOV WR6, #WORD0 P0PU
MOV WR4, #WORD2 P0PU
MOV A, #0FFH
MOV @DR4, R11
问题2:SPX是扩展堆栈指针
楼上的内容应该写入STC32的DATASHEET中。 8051我还可以,但是c251有点复杂了 弄明白5楼的图,251汇编还是很好学的。
页:
[1]