编写程序,将0x12345678—0x1234567B四个数存入寄存器RO-R3,使用单寄存器加载/存储指令 LDR/STR将RO-R3 中的数据存入从地址0x20000000 开始的 16字节中,再用多单存器加载指令特这 16字节从内存加载到奇存器 R4-R7。
时间: 2024-02-18 18:05:57 浏览: 186
汇编代码如下:
```
LDR R0, =0x12345678 ; 将0x12345678存入R0
LDR R1, =0x1234567B ; 将0x1234567B存入R1
MOV R2, #0 ; 将0存入R2
MOV R3, #0 ; 将0存入R3
STR R0, [R2, #0] ; 将R0中的值存入地址为0x20000000的内存中
STR R1, [R2, #4] ; 将R1中的值存入地址为0x20000004的内存中
STR R2, [R2, #8] ; 将R2中的值存入地址为0x20000008的内存中
STR R3, [R2, #12] ; 将R3中的值存入地址为0x2000000C的内存中
LDR R4, [R2, #0] ; 将地址0x20000000中的值加载到R4中
LDR R5, [R2, #4] ; 将地址0x20000004中的值加载到R5中
LDR R6, [R2, #8] ; 将地址0x20000008中的值加载到R6中
LDR R7, [R2, #12] ; 将地址0x2000000C中的值加载到R7中
```
相关问题
编写程序,将0x12345678至0x1234567B四个数存入寄存器R0至R3,用多寄存器存储指令将R0至R3中的数据存入从地址0x20000000开始的16字节中,再用多寄存器加载指令将这16字节从内存加载到寄存器R4至R7
以下是ARM汇编代码实现:
```
; 将0x12345678至0x1234567B四个数存入寄存器R0至R3
ldr r0, =0x12345678
ldr r1, =0x12345679
ldr r2, =0x1234567A
ldr r3, =0x1234567B
; 将R0至R3中的数据存入从地址0x20000000开始的16字节中
stmia 0x20000000!, {r0-r3}
; 将这16字节从内存加载到寄存器R4至R7
ldmia 0x20000000!, {r4-r7}
```
AREA Reset, CODE ENTRY Reset Reset: MOV R0, #5 ; 初始化数字A MOV R1, #3 ; 初始化数字B COMPARE: CMP R0, R1 ; 如果A<B,跳转到RIGHT_LED BLT RIGHT_LED CMP R0, R1 ; 如果A>B,跳转到SWAP BGT SWAP CMP R0, R1 ; 如果A=B,跳转到BOTH_LED BEQ BOTH_LED RIGHT_LED: MOV R2, #0x80 ; 把右LED的控制码存入R2 LDR R3, [ =0x101F1000 ] ; 把GPIO的地址存入R3 STR R2, [R3, #0x10] ; 把控制码写入GPIO数据寄存器 B END SWAP: MOV R2, R0 ; 把A存入R2 MOV R0, R1 ; 把B存入A MOV R1, R2 ; 把R2中的A存入B MOV R2, #0x20 ; 把左LED的控制码存入R2 LDR R3, [ =0x101F1000 ] ; 把GPIO的地址存入R3 STR R2, [R3, #0x10] ; 把控制码写入GPIO数据寄存器 B END BOTH_LED: MOV R2, #0xA0 ; 把两个LED的控制码存入R2 LDR R3, [ =0x101F1000 ] ; 把GPIO的地址存入R3 STR R2, [R3, #0x10] ; 把控制码写入GPIO数据寄存器 END: B END ; 无限循环 END,改正,存在错误
代码存在一个错误,即在END标签后面的B END指令会导致程序陷入死循环。应该将其改为B Reset,使程序重新从Reset标签开始执行。修改后的代码如下:
```
AREA Reset, CODE
ENTRY Reset
Reset:
MOV R0, #5 ; 初始化数字A
MOV R1, #3 ; 初始化数字B
COMPARE:
CMP R0, R1 ; 如果A < B,跳转到RIGHT_LED
BLT RIGHT_LED
CMP R0, R1 ; 如果A > B,跳转到SWAP
BGT SWAP
CMP R0, R1 ; 如果A = B,跳转到BOTH_LED
BEQ BOTH_LED
RIGHT_LED:
MOV R2, #0x80 ; 把右LED的控制码存入R2
LDR R3, [ =0x101F1000 ] ; 把GPIO的地址存入R3
STR R2, [R3, #0x10] ; 把控制码写入GPIO数据寄存器
B END
SWAP:
MOV R2, R0 ; 把A存入R2
MOV R0, R1 ; 把B存入A
MOV R1, R2 ; 把R2中的A存入B
MOV R2, #0x20 ; 把左LED的控制码存入R2
LDR R3, [ =0x101F1000 ] ; 把GPIO的地址存入R3
STR R2, [R3, #0x10] ; 把控制码写入GPIO数据寄存器
B END
BOTH_LED:
MOV R2, #0xA0 ; 把两个LED的控制码存入R2
LDR R3, [ =0x101F1000 ] ; 把GPIO的地址存入R3
STR R2, [R3, #0x10] ; 把控制码写入GPIO数据寄存器
END:
B Reset ; 重新从Reset标签开始执行
END ; 结束程序
```
阅读全文