汇编随笔

来源:互联网 发布:学摄影的书籍知乎 编辑:程序博客网 时间:2024/06/08 17:39

伪指令

AREA指令

DCB DCD指令

B跳转指令

在ARM程序中有两种方法可以实现程序流程的跳转:

1,直接向程序计数器PC写入跳转地址值。
通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用
MOV LR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。

2,使用跳转指令。
ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令:
1,B 跳转指令
2,BL 带返回的跳转指令
3,BLX 带返回和状态切换的跳转指令
4,BX 带状态切换的跳转指令

CPSID CPSIE 快速的开关中断指令

CPSID CPSIE 用于快速的开关中断。UCOSII中在

指令 参数 寄存器值 行为 CPSID I PRIMASK=1, ;关中断 CPSIE I PRIMASK=0, ;开中断 CPSID F FAULTMASK=1, ;关异常 CPSIE F FAULTMASK=0, ;开异常

注:I:IRQ ; F:FIQ。在Cortex内核中没有FIQ中断,都按IRQ处理。

指令示例:

临界代码函数:
OS_CPU_SR_Save
MRS R0, PRIMASK ;读取primask到R0,R0为返回值
CPSID I ;PRIMASK=1,关中断
BX LR ;返回

LDR STR数据传输指令

Cortex内核用的比较多的是伪指令方式,虽然LDR伪指令和ARM的LDR指令很像,但是作用不太一样。LDR伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中,比如: ldr r0, =0x12345678 这样,就把0x12345678这个地址写到r0中了,而不是0x12345678地址所存储的值。
例如:
LDR R1,=COUNT ;这条伪指令,是将COUNT的地址赋给R1
LDR R0,[R1] ;将COUNT的值赋给R0
其他详细用法见下链接。

http://blog.csdn.net/tanyouliang/article/details/6767011

MRS与MSR指令

a,MRS Move to Register from State register

MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。

使用格式:

MRS{条件} 通用寄存器,特殊功能寄存器(Cortex内核中是PRIMASK或FAULTMASK,其他内核通常为CPSR或SPSR;当条件为空的时候语句无条件执行)

该指令一般用在以下情况:

I.当需要改变程序状态寄存器的内容时,通常使用:读取-修改-写回的步骤,MRS指令用于将程序状态寄存器的内容读取到通用寄存器中,然后更改。
II.当在异常处理戒迕程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄
存器的值,然后保存。

指令示例:

临界代码段使用的函数
OS_CPU_SR_Save
MRS R0, PRIMASK ;读取primask到R0,R0为返回值
CPSID I ;PRIMASK=1,关中断。
BX LR ;·

b,MSR Move from State registerto Register

MRS指令用于将通用寄存器的内容读取到特殊功能寄存器中。

该指令一般用在以下情况:

I.当需要改变特殊功能寄存器的内容时,通常使用:读取-修改-写回的步骤,MSR指令可以把通用寄存器的值写回到特殊功能寄存器。
II.当退出异常中断处理器程序时,如果事先保存了特殊功能寄存器的内容通常通过MSR指令将事先保存的特殊功能寄存器内容恢复到特殊功能寄存器中。

指令示例:

临界代码段使用的函数
OS_CPU_SR_Restore
MSR PRIMASK, R0 ;把R0的参数读取到primask寄存器中
BX LR ;

0 0