arm中ldr相关

area Init, code, readonly
code32
entry
start
  ;ldr :从内存中读取数据到寄存器
  ;str :将寄存器中的数据存储到内存中
  ; 指令操作的内存空间是可读可写的空间,本次配置中0x40000000
  ;mov r0, #0x40000000
  ldr r0, =0x40000010
  ;mov r1, #0x64
  ;str r1, [r0]   ; 存,将r1中的数据存入r0中所存的地址
  ;ldr r2, [r0]    ; 读,将r0中的数据读出到r2,让人看到
  


  mov r1, #100
  mov r2, #200
  mov r3, #300
  ;地址:基址寄存器 + 偏移量
  ;偏移量的形式
  ; 1.立即数,每个数字占了四位
  str r1, [r0, #4]  ; r1 -> [r0+4]
  str r2, [r0]
  str r3, [r0, #-4]
  mov r1, #0
  mov r2, #0
  mov r3, #0


  ldr r1, [r0, #4]  ; r1 -> [r0+4]
  ldr r2, [r0]
  ldr r3, [r0, #-4]


  mov r4, #4
  ;2.寄存器,将寄存器中的数字换成十进制数字,根据数字的多少进行位移
  str r1, [r0, r4]  ; r1 -> [r0+4]
  ;此时,r0的地址将发生变化,即将地址位移四个位
  str r2, [r0]
  ;此时,将会把先前赋给此位置的数值给覆盖
  str r3, [r0, -r4]
  mov r1, #0
  mov r2, #0
  mov r3, #0


  ldr r1, [r0, r4]  ; r1 -> [r0+4]
  ldr r2, [r0]
  ldr r3, [r0, -r4]




  mov r4, #4
  ;3.寄存器移位一个立即数
  ;注意:不能移位一个寄存器。
  str r1, [r0, r4, lsl #1]  ; r1 -> [r0+4*2]
  str r2, [r0]
  str r3, [r0, -r4, lsl #1]
  mov r1, #0
  mov r2, #0
  mov r3, #0
 
  ldr r1, [r0, r4, lsl #1]  ; r1 -> [r0+4*2]
  ldr r2, [r0]
  ldr r3, [r0, -r4, lsl #1]


  ; 从地址的计算方法来划分
  ; 1.零偏移
  mov r1, #0x64
  str r1, [r0]   ; 存
  ldr r2, [r0]    ; 读


  ;2.前索引偏移 :基地址先+偏移地址,再进行存取。
  ; 默认基地址不变化,如果希望修改基地址,加上!
  str r1, [r0, #4]!    ; r1 -> [r0+4]
  str r2, [r0]
  str r3, [r0, #-4]!
  mov r1, #0
  mov r2, #0
  mov r3, #0


  ldr r1, [r0, #4]!  ; r1 -> [r0+4]
  ldr r2, [r0]
  ldr r3, [r0, #-4]!


  ;3.后索引: 先存取,再更新基地址。不允许是r15
  ; 默认是修改基地址。
  str r1, [r0], #4
  ldr r1, [r0], #4


  str r3, [r0], -r4


  str r3, [r0], -r4, lsl #1


  ;4.程序相对偏移,将标号对应地址的值取出。
  ldr r1, stop


  ;练习:批量内存处理,往地址为0x40000000的起始地址内存入10个字数据
  ;数据分别为1-10.
  ;然后读取出来存入到r2中
  ldr r0, =0x40000000
  mov r7, #10
  mov r1, #0
loops
  add r1, r1, #1
  str r1, [r0], #4
  sub r7, r7, #1
  cmp r7, #0
  bne loops


  mov r7, #10
loop2
  ldr r2, [r0, #-4]!
  sub r7, r7, #1
  cmp r7, #0
  bne loop2


stop
b stop
end

你可能感兴趣的:(arm中ldr相关)