ARM9指令详解1
来源:互联网 发布:mac虚拟机能玩游戏吗 编辑:程序博客网 时间:2024/05/16 17:04
1、
Arm指令集中,LDR既可以做为加载指令,也可以作为伪指令。
1)
eg:
COUNT EQU
……
LDR
MOV
STR
COUNT是我们定义的一个变量,地址为0x40003100。这中定义方法在汇编语言中是很常见的,如果使用过单片机的话,应该都熟悉这种用法。
LDR
MOV
2)
eg:
;将COUNT的值赋给R0
LDR
LDR
LDR
3)、认真阅读下列代码,体会LDR的两种用法
在代码中:
start:
;MyHandleIRQ:
MyHandleIRQ:
在“之前出错的一行”处,如果改成“ldr pc,MyHandleIRQ”当中断来临时,无法进行中断处理。
另一种情况是正确的,注意体会:
start:
MyHandleIRQ:
;MyHandleIRQ:
;
;
;
;
因为当中断来临时,还需要去MyHandleIRQ处把OS_CPU_IRQ_ISR取出,即多取一次存储器。
2、
STR Rd , addressing ;[addressing]←Rd (store)
STR r0, [r1, #0x10] ;r1+0x10这个是所用的实际地址值,但是不会写入r1,在此句之后,r1值不变
STR r0, [r1], #0x10 ;r1+0x10这个是所用的实际地址值,这个值会写入r1,此句之后,r1=r1+0x10
STR用来存取内存,从rom到ram,而mov是ram里用的
3、
批量加载/存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。LDM为加载多个寄存器,STM为存储多个寄存器。允许一条指令传送16个寄存器的任何子集或所有寄存器。指令格式如下:
地址对准――这些指令忽略地址的位[1:0]。在进行数据复制时,先设置好源数据指针,然后使用块拷贝寻址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB /STMDB 进行读取和存储。而进行堆栈操作时,则要先设置堆栈指针,一般使用SP然后使用堆栈寻址指令STMFD/LDMFD、STMED。LDMED、STMFA/LDMFA、STMEA/LDMEA实现堆栈操作。
寄存器的任意子集或者所有的寄存器都可以被指定,唯一的限制是寄存器列表不应该为空。任何时候R15被存储到MEM中,存储的值时指令地址加12。传输地址是由Rn中的内容和前/后向索引位,上/下位决定的,寄存器的传输按照从低向高的顺序。如果寄存器列表中有R15,则R15在最后一个被传输。序号低得寄存器对应于存储器的低地址。
详解
1)、STMFD SP!,{R0,R1,R2,R14}
效果图如下:
2)、LDMFD SP!,{R0,R1,R2,R14}
效果图:
3)、STMED SP!,{R0,R1,R2,R14}
效果图:
4)、LDMED SP! , {R0,R1,R2,R14}
效果图:
5)STMFA SP!,{R0,R1,R2,R14}
效果图:
6)、LDMFA SP!,{R0,R1,R2,R14}
效果图:
7)、STMEA SP!,{R0,R1,R2,R14}
效果图
8)、LDMEA SP!,{R0,R1,R2,R14}
效果图
9)、STMIA R0!,{R1,R2,R3,R14}
效果图
10)、LDMIA R0!,{R1,R2,R3,R14} ; 先传后增,RAM to寄存器
效果图
11)、STMIB R0!,{R0,R1,R2,R14}
效果图:
12)、LDMIB R0!, {R1,R2,R3,R14}
效果图:
13)、STMDA R0! , {R1,R2,R3,R14}
效果图:
14)、LDMDA RO!,{R1,R2,R3,R14}
效果图:
15)、STMDB R0!,{R1,R2,R3,R14}
效果图
16)、LDMDB R0! , {R1,R2,R3,R14}
效果图:
4、B、BL、BX、BLX和BXJ指令
如果
[31:28]位是条件码;[27:24]位为“1010”时,表示B跳转指令,为“1011”时,表示BL跳转指令;[23:0]表示偏移地址。使用B或BL跳转时,下一条指令的地址是这样计算的:将指令中24位带符号的补码立即数扩展为32(扩展其符号位);将此32位数左移两位;将得到的值加到pc寄存器中,即得到跳转的目标地址。既由于偏移地址为24位所以,跳转范围为32M。
- ARM9指令详解1
- ARM9 汇编指令总结1
- ARM9自学笔记_汇编指令1
- ARM9协处理器CP15、MCR/MRC指令
- ARM9汇编——易混淆指令
- 基于ARM9的伪指令汇总
- 详解ARM9的CPSR寄存器
- 基于ARM9的汇编指令:数据传送指令,算术运算指令,比较指令和跳转指令
- ARM9调试笔记1
- ARM9
- ARM汇编指令详解1
- 关于ARM9中的协处理器CP15及MCR/MRC指令
- 关于ARM9协处理器CP15及MCR和MRC指令
- 关于ARM9协处理器CP15及MCR和MRC指令
- 关于ARM9协处理器CP15及MCR和MRC指令
- 关于ARM9协处理器CP15及MCR和MRC指令
- 关于ARM9协处理器CP15及MCR和MRC指令
- 关于ARM9协处理器CP15及MCR和MRC指令
- 【翻自LeetCode】求两排序后数组的中位数
- 第十二周项目1-2private继承下的访问权限和继承方式
- android工程运行报错:unabel to stat activity componentinfo{xx.xx.xxActivity}java.lang.NullPointerException
- 职场规划:三招挑战高薪高职
- aspx 常见错误 CS0016: 未能写入输出文件“c:/WINDOWS/Micros
- ARM9指令详解1
- 第十二周项目1-3protected继承下的访问权限和继承方式
- 【LeetCode】Median of Two Sorted Arrays
- Struts2——SSH (Spring+Struts+Hibernate)框架搭建之配置文件序列一
- ubuntu无法识别android手机
- Linux下测试磁盘I/O性能
- 关于mongodb默认连接
- 二维数组的指针 != 指针的指针
- ACM中java的使用