arm中ldr相关

    xiaoxiao2021-03-26  12

    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
    转载请注明原文地址: https://ju.6miu.com/read-500031.html

    最新回复(0)