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