打印
[ZLG-ARM]

有没有用汇编玩M0的?

[复制链接]
3487|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jjt1975|  楼主 | 2010-8-19 14:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在学习NXP的M0芯片,谢谢周立功提供的开发板和简易仿真器(虽然只能设置2个断点)。发现M0在对IO操作的时候编码的效率并不是很高。正常情况下配置一个端口的状态需要3条语句。读端口寄存器,修改寄存器的内容,回写I/O寄存器。
但是在C语言如果表述为:

#define KEY_COL2  (1ul << 10) //P2_10
#define SET_KEY_COL2()  GPIO2DATA|=KEY_COL2   

程序里面调用               

SET_KEY_COL2()

看反汇编就成了7句代码了

MOV  R0 , R1                              //此语句不明白有啥用?
LDR  R0 , [R0 , #0x0000003C]    //读IO寄存器到R0
MOVS  R1 , #0x00000001           //
LSLS  R1 , R1 , #0x0000000A     //一个立即数居然要这么产生,效率太低了吧
ORRS  R0 , R1                           //更改数据(M0没有立即数操作指令?)
LDR  R1 , [PC , #0x00000254]    //此话就不清楚是什么意思了?
STR  R0 , [R1 , #0x0000003C]   //回写寄存器

感觉里面有用的也就3句

00001494    0x6BC0        LDR  R0 , [R0 , #0x0000003C]      //读寄存器  
0000149A    0x4308        ORRS  R0 , R1         //设置新值  ,  ARM里面是不是没有立即数操作指令?
0000149E    0x63C8        STR  R0 , [R1 , #0x0000003C]     //回写寄存器

那里有M0的指令集的资料?TKSTADIO是否可以支持汇编开发?

相关帖子

沙发
hotpower| | 2010-8-19 18:34 | 只看该作者
这和arm体系有关。
它的立即数或函数指针都要到附近数据区域(文件池)中取出才可。
故三条指令恐怕不行。

使用特权

评论回复
板凳
hgjinwei| | 2010-8-19 19:10 | 只看该作者
MOV  R0 , R1                              //此语句不明白有啥用? /* 前面应该还有一个类似于LDR R1,[PC,#XXX]的指令 */
LDR  R0 , [R0 , #0x0000003C]    //读IO寄存器到R0   
MOVS  R1 , #0x00000001           //
LSLS  R1 , R1 , #0x0000000A     //一个立即数居然要这么产生,效率太低了吧  /* 1u<<10已经超过了ARM的立即数寻址范围 */
ORRS  R0 , R1                           //更改数据(M0没有立即数操作指令?) /* 这个还真不能写成 ORRS R0, #(1<<10) */
LDR  R1 , [PC , #0x00000254]    //此话就不清楚是什么意思了? /* 伪指令 LDR R1,=XXX 的原型,其实就是定位寄存器地址 */
STR  R0 , [R1 , #0x0000003C]   //回写寄存器

使用特权

评论回复
地板
jjt1975|  楼主 | 2010-8-20 10:52 | 只看该作者
如果是这样,那M0的I/O处理能力比起PIC或AVR来还是有差距的。就是工作在50MHz也达不到AVR处理I/O口的速度了。

使用特权

评论回复
5
jjt1975|  楼主 | 2010-8-20 11:05 | 只看该作者
ORRS  R0 , R1                           //更改数据(M0没有立即数操作指令?) /* 这个还真不能写成 ORRS R0, #(1<<10) */
请问3楼,此句若写成

ORRS  R0,#0x00000400     可否?

使用特权

评论回复
6
jjt1975|  楼主 | 2010-8-20 11:07 | 只看该作者
LDR  R0 , [R0 , #0x0000003C]      //读寄存器  
ORRS  R1,#0x00000400
ORRS  R0 , R1         //设置新值  ,  ARM里面是不是没有立即数操作指令?
STR  R0 , [R1 , #0x0000003C]     //回写寄存器

使用特权

评论回复
7
jjt1975|  楼主 | 2010-8-20 11:07 | 只看该作者
LDR  R0 , [R0 , #0x0000003C]      //读寄存器  
MOVS  R1,#0x00000400
ORRS  R0 , R1         //设置新值  ,  ARM里面是不是没有立即数操作指令?
STR  R0 , [R1 , #0x0000003C]     //回写寄存器

使用特权

评论回复
8
hotpower| | 2010-8-20 14:13 | 只看该作者
俺没研究过M0的汇编。
ARM只能有小的立即数,不可能有32位的立即数。

使用特权

评论回复
9
hgjinwei| | 2010-8-20 19:06 | 只看该作者
回5L

你认为假如可以的话, ORRS  R0,#0x00000400 和 ORRS R0, #(1<<10)  有区别吗?

这个可以这样编或许会快点:(注,未必是M0指令,我没见过M0指令是咋样的)
LDR       R0, =GPIO2DATA
LDR       R1, =KEY_COL2
LDR       R2, [R0]
ORRS    R2, R2, R1
STR        R2,[R0]

还有,将一个IO置1不是可以直接将某个寄存器对应位写1,其他位写0就行了吗,还要作或运算?
比如STM32的IO  
#define SET_GPIOB_10  GPIOB->BSRR = (1u<<10)
这样可以至少省两条指令。

使用特权

评论回复
10
6019实验室| | 2010-8-22 00:05 | 只看该作者
我用汇编,但是没用过M0的,不过将一个IO置1是可以直接将某个寄存器对应位写1,其他位写0就行了,但是写的语句质上就是作或运算

使用特权

评论回复
11
七叶一枝花| | 2010-11-29 17:27 | 只看该作者
没有用过这个。

使用特权

评论回复
12
diny| | 2010-12-2 16:41 | 只看该作者
帮顶。学习之,

使用特权

评论回复
13
QQTony| | 2010-12-4 12:58 | 只看该作者
ANDS ORRS EORS BICS ADCS SBCS 都无#imme; LDRB/STRB Rd,[Rn+imme] 之imme最大是31; 其它指令之imme最大基本是imme8; 除3条指令外, R8--R12用不到; 无除法; 无ITT ... 总之看了CORTEX-M0的指令集你立马转回8位之STM8,AVR!

使用特权

评论回复
14
bairan168| | 2010-12-28 10:02 | 只看该作者
很详细了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

37

帖子

0

粉丝