打印

Cortex-M3 CPU指令集

[复制链接]
959|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zya888|  楼主 | 2016-3-24 13:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
Cortex-M3的指令集包括:
CMSIS函数;
存储器访问指令;
通用的数据数据指令;
乘法和除法指令;
饱和指令;
比特位域操作指令;
分支和控制指令;
杂项指令;
沙发
zya888|  楼主 | 2016-3-24 13:35 | 只看该作者
后缀                 标志                 含义
EQ                 Z=1                 等于
NE                 Z=0                 不等于
CS或者HS         C=1                 高或者相同,无符号
CC或者LO         C=0                 低,无符号
MI                 N=1                 负
PL                 N=0                 正或零
VS                 V=1                 溢出
VC                 V=0                 没有溢出
HI                 C=1和Z=0         高,无符号
LS                 C=0或Z=1         低或者相同,无符号
GE                 N=V                 大于或者等于,有符号
LT                 N!=V                 小于,有符号
GT                 Z=0和N=V         大于,有符号
LE                 Z=1和N!=V         小于等于,有符号
AL                 能有任何值         总是。当没有指定后缀时,这是默认的

使用特权

评论回复
板凳
heping517| | 2016-3-24 13:36 | 只看该作者
指令宽度选择
        Cortex-M3指令集中的很多指令可以产生16位编码或者32位编码,这取决于指定的操作数和目标寄存器。通过使用带有宽度后缀,强迫一个指定的具体的指令大小。.W后缀强迫一个32位指令编码。.N后缀强迫一个16位指令编码。

使用特权

评论回复
地板
heping517| | 2016-3-24 13:48 | 只看该作者
如果给出了宽度后缀,而汇编器不能产生一个所要求宽度的指令编码,则产生一个错误。
         在一些情况下,需要指定.W后缀。比如,分支指令中,如果操作数是一个指令的标号或者一个文字的数据。这是由于汇编器不能自动地产生正确大小的编码。

使用特权

评论回复
5
zya888|  楼主 | 2016-3-24 14:08 | 只看该作者
        ISO/IEC C代码不能直接访问一些Cortex-M3指令。这部分给出使用CMSIS和C编译器内提供的固有函数,它能产生这些指令。如果C编译器不支持合理的固有函数,可以使用内联汇编器访问一些指令。下表 给出了Cortex微控制器软件接口标准(Cortex Microcontroller Software Interface Standard,CMSIS)函数产生一些Cortex-M3指令

使用特权

评论回复
6
dianz| | 2016-3-24 14:10 | 只看该作者
指令                         CMSIC函数
CPSIE I         void __enable_irq(void)
CPSID I         void __disable_irq(void)
CPSIE F         void __enable_fault_irq(void)
CPSID F         void __disable_fault_irq(void)
ISB                 void __ISB(void)
DSB                 void __DSB(void)
DMB                 void __DMB(void)
REV                 uint32_t __REV(uint32_t int value)
REV16         uint32_t __REV16(uint32_t int value)
REVSH         uint32_t __REVSH(uint32_t int value)
RBIT                 uint32_t __RBIT(uint32_t int value)
SEV                 void __SEV(void)
WFE                 void __WFE(void)
WFI                 void __WFI(void)

使用特权

评论回复
7
heping517| | 2016-3-24 14:11 | 只看该作者
对于以上的指令,需要注意下面的一些限制:Rd不能是PC和SP。

使用特权

评论回复
8
heping517| | 2016-3-24 14:30 | 只看该作者
指令系统

QQ截图20160324142945.jpg (176.72 KB )

QQ截图20160324142945.jpg

使用特权

评论回复
9
dianz| | 2016-3-24 14:31 | 只看该作者
当Rt是SP或者PC时,只能使用字类型,即LDR指令后没有{type}后缀。当Rt是PC时,必须满足:
加载值的bit[0]位,必须是1,用于正确的执行;
如果指令是有条件的,它必须是IT块的最后一条指令。

使用特权

评论回复
10
dianz| | 2016-3-24 14:41 | 只看该作者
对于LDRD指令,Rt和Rt2是不同的。
对于STR指令,当Rt是SP时,为字操作;Rt和Rn不能是PC。
在预索引和索引后模式下,对于LDR和STR指令,Rt2和Rt2是不同的。

使用特权

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

本版积分规则

32

主题

239

帖子

1

粉丝