公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

Cortex M处理器汇编语言编程之四:扩展,倒序,SVC,MRS, MSR

Cortex M处理器汇编语言编程之四:扩展,倒序,SVC,MRS, MSR

User12775
Level 5
Level 5
First solution authored First like received

基础指令最后一篇. Cortex M0指令总共56条, 很快就可以学习完.

1.扩展指令

即把一个1Byte或者2Byte长的数据扩展到更长的数据类型.如果是无符号类型,直接在高位补0即可,如果是有符号类型则需要保留符号扩展.4种情况:1Byte, 2Byte长,有无符号,一共四种扩展操作都有相应的指令.

;Signed halfword to word

         ALIGN

asm_s16ext FUNCTION   

         EXPORT asm_s16ext

        

         SXTH r0, r0

         bx lr

        

         ENDP

                 

;Signed byte to word

         ALIGN

asm_s8ext FUNCTION   

         EXPORT asm_s8ext

        

         SXTB r0, r0

         bx lr

        

         ENDP

        

;Unsigned halfword to word

         ALIGN

asm_u16ext FUNCTION   

         EXPORT asm_u16ext

        

         UXTH r0, r0

         bx lr

        

         ENDP

                 

;Unsigned byte to word

         ALIGN

asm_u8ext FUNCTION   

         EXPORT asm_u8ext

        

         UXTB r0, r0

         bx lr

        

         ENDP

 

2.字节倒序

Cortex M系列的处理器在标准中可以实现为Little Endian, 或者 Big Endian. 现实情况下Little Endian居多. 不管哪一种实现, 总会遇到与内核Endian不同的数据,比如涉及到处理网络数据的程序经常需要做这种转换, 因为网络数据一般为Big Endian.

倒序的指令有三个, 分别为REV, REV16, REVSH. 分别是将4Byte完全倒序,分别在高低16bit进行倒序,低进行低16bit的倒序并且扩展符号.

;Reverse Bytes in word

         ALIGN

asm_rev FUNCTION   

         EXPORT asm_rev

        

         REV r0, r0

         bx lr

        

         ENDP      

 

;Reverse Bytes in both halfwords

         ALIGN

asm_rev16 FUNCTION   

         EXPORT asm_rev16

        

         REV16 r0, r0

         bx lr

        

         ENDP      

                 

;Reverse Signed bottom half word

         ALIGN

asm_revsh FUNCTION   

         EXPORT asm_revsh

        

         REVSH r0, r0

         bx lr

        

         ENDP

        

3.SVC指令

SVC指令一般用于RTOS.用户域请求系统域的权限,保持用户域与系统域代码的隔离,但是用户域又能通过SVC指令来请求系统域的功能. Cortex M0内核在硬件上没有权限的概念,即用户域的代码即可完成所有操作.但是1.为了软件上保持与高版本的内核兼容 2.为软件实现隔离提供支持.还是有SVC这个指令.

SVC指令的使用语法:

SVC #imm
其中imm是0-255的立即数,即SVC可以有256种号码. 事实上SVC的指令格式:

DFxx

这个号码在硬件上对内核没有作用, 纯用于软件来识别SVC号码.如何取出SVC号码,后面会讲.

;Supervisor Call 1

         ALIGN

asm_svc_1 FUNCTION   

         EXPORT asm_svc_1

        

         SVC #1

        

         bx lr

        

         ENDP

 

4.MRS, MSR指令.

读写特殊寄存器的指令.

特殊指令包括:

APSR, IPSR, EPSR, IEPSR, IAPSR, EAPSR, PSR, MSP, PSP, PRIMASK, CONTROL

这里以PRIMASK读写为例.

 

;Test special register write

;special register is one of the special-purpose registers: APSR, IPSR, EPSR, IEPSR, IAPSR,

;EAPSR, PSR, MSP, PSP, PRIMASK, or CONTROL.

         ALIGN

asm_test_msr FUNCTION   

         EXPORT asm_test_msr

         ;Write 0x00000001 to disable all exceptions with configurable priority

         ;Write 0x00000000 to enable all exceptions with configurable priority

         MSR PRIMASK,r0

        

         bx lr

        

         ENDP      

                 

;Test special register read

;special register is one of the special-purpose registers: APSR, IPSR, EPSR, IEPSR, IAPSR,

;EAPSR, PSR, MSP, PSP, PRIMASK, or CONTROL.

         ALIGN

asm_test_mrs FUNCTION   

         EXPORT asm_test_mrs

        

         MRS r0, PRIMASK

        

         bx lr

        

         ENDP      

0 点赞
2700 次查看
7 评论