ywsxj 发表于 2023-12-29 09:55:51

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",改初始化,也会错乱;

杨为民 发表于 2023-12-29 12:44:38

我的这个帖子或许对你有帮助
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=3615

zxcv1973 发表于 2023-12-29 14:17:41

MOV   DPTR,#P0PU改为MOV   DPTR,#WORD0 P0PU就不会报警了,SPX是C251的内置寄存器,属于寄存器DR60的别名,程序中也可用DR60代替

zxcv1973 发表于 2023-12-29 14:20:45

不过只用DPTR访问不了XFR寄存器,还要结合DPXL才行,都用STC32了,肯定要使用DR0-DR28寄存器来访问XFR了

乘风飞扬 发表于 2023-12-29 14:43:40

问题1:扩展寄存器设置可参考STC32G实验箱例程包里面的汇编例子,如:
    ORL   P_SW2,#080H    ;使能访问XFR
    MOV   WR6, #WORD0 P0PU
    MOV   WR4, #WORD2 P0PU
    MOV   A, #0FFH
    MOV   @DR4, R11
问题2:SPX是扩展堆栈指针

社区闲人 发表于 2023-12-29 15:50:44

楼上的内容应该写入STC32的DATASHEET中。

lzl1okOK 发表于 2023-12-29 15:58:07

8051我还可以,但是c251有点复杂了

社区闲人 发表于 2023-12-29 16:35:46

弄明白5楼的图,251汇编还是很好学的。
页: [1]
查看完整版本: STC32F12K54汇编问题