|
.global _start
_start:
mov r1,#0x10
mov r2,#0x20
ldmia r1,{r2} //将r1对应的内存地址中的数据送给r2寄存器
//ldmia r1,[r2] Error: expression too complex -- `ldmia r1,[r2]'
//ldmia r1,{[r2]} Error: ARM register expected -- `ldmia r1,{[r2]}'
//总结:ldm和ldr指令从CPU角度来看都是加载,即从存储器中将数据传到寄存器中,不过ldr指令中的目的寄存器在左边,而ldm指令中目的寄存器列表在右边
//ldr/ldrb/ldrh 目的寄存器 源存储器对应的地址 而ldm指令则是 ldm 源存储器对应的首地址 目的寄存器列表
//总之,ldm和ldr等加载类的指令都是从内存中将数据送到寄存器
//str/strb/strh/stm等指令中的st是store的简写即从CPU角度来看是保存,也就是从CPU内部的寄存器将数据送到存储器中
//str/strb/strh 源寄存器,目的存储器对应地址 而stmfd(是满递减堆栈类型)目的存储器对应地址首地址 源寄存器
//再次总结:
//加载时,ldr/ldrb/ldrh将数据从存储器加送到寄存器等一次性加载类指令的源存储器对应的地下写在右边,ldm多次加载指令的源存储器对应的首地址写在左边
//保存时,str/strb/strh将数据从寄存器送到存储器等一次性保存类指令的源寄存器写在左边,stm多次保存类指令对应的源寄存器写在右边
//单次加载和多次加载的源存储器地址或首地址方向相反
//单次保存和多次保存的源寄存器方向相反
//加载和保存不论是单次还是多次在方向上来说最好不要记混了,最多只需要记住:加载时的源与保存时的源方向相反
//LDR指令有多种寻址方式,见t.s
//STR指令应该也有多种寻址方式
//a)可以寄存器寻址吗?
//STR R0,R1 //出现:Error: internal_relocation (type: OFFSET_IMM) not fixed up https://blog.csdn.net/szm1234/article/details/109764869
//出现上面的internal_relocation错误,分析见https://blog.csdn.net/jn_statham/article/details/106823270,所以需要先初始化内存之后再执行上句。
//b)可以立即数寻址吗?
//STR R0,#0x1000 //出现:Error: internal_relocation (type: OFFSET_IMM) not fixed up https://blog.csdn.net/szm1234/article/details/109764869
STR R0,#0x10 //也是出现:Error: internal_relocation (type: OFFSET_IMM) not fixed up
//c)可以寄存器移位寻址吗?
//STR R0,R1,LSL #3 Error: garbage following instruction -- `str R0,R1,LSL#3'
//STR R0,[R1],R2,LSL #4 Error: garbage following instruction -- `str R0,[R1],R2,LSL#4'
LDR R0,[R1,R2,LSL #2] //这句编译成功
//LDR R0,[R1],R2,LSL #2 //这句出现:Error: garbage following instruction -- `ldr R0,[R1],R2,LSL#2'
//d)可以寄存器间接寻址吗?
//STR R0,[R2]
//e)可以基址变址寻址吗?
STR R1,[R2,#4]
STR R1,[R2,R3]
b .
.end
|
|