写出连续写入两个半字的代码,并说明执行过程。 MOV R0, #0x08000000 MOV R1,#0x00001234 STR R1, [R0], #2 STR R2, [R0] 若STR改为STRH/STRB? 若向0x08200003写一个字节? 若改为MOV R0, #0x08200000,有没有区别?
时间: 2023-12-28 08:04:53 浏览: 29
连续写入两个半字的代码如下:
```
MOV R0, #0x08000000
MOV R1, #0x00001234
STRH R1, [R0], #2
STRH R2, [R0]
```
执行过程如下:
1. 将0x08000000存入R0寄存器中。
2. 将0x00001234存入R1寄存器中。
3. 将R1寄存器中的值以半字(16位)的形式存入R0寄存器所指向的内存地址中(即0x08000000),同时地址自动加上2,指向下一个半字的地址。
4. 将R2寄存器中的值以半字(16位)的形式存入R0寄存器所指向的内存地址中(即0x08000002)。
若STR改为STRH/STRB,执行过程如下:
- 若改为STRH,则第4步中存储的值以半字(16位)的形式存入0x08000002地址中,但是第3步中存储的值也必须是半字(16位)。
- 若改为STRB,则第4步中存储的值以字节(8位)的形式存入0x08000001地址中,但是第3步中存储的值也必须是字节(8位)。
若向0x08200003写一个字节,代码如下:
```
MOV R0, #0x08200003
MOV R1, #0x56
STRB R1, [R0]
```
执行过程如下:
1. 将0x08200003存入R0寄存器中。
2. 将0x56存入R1寄存器中。
3. 将R1寄存器中的值以字节(8位)的形式存入R0寄存器所指向的内存地址中(即0x08200003)。
若改为MOV R0, #0x08200000,区别在于写入的地址不同,其他执行过程与第一段代码相同。
相关问题
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 ; 结束程序
```
AREA Reset, CODE ENTRY MOV R0, #5 ; 初始化数字A MOV R1, #3 ; 初始化数字B COMPARE: CMP R0, R1 ; 比较A和B BLT RIGHT_LED ; 如果A<B,跳转到RIGHT_LED BGT SWAP ; 如果A>B,跳转到SWAP BEQ BOTH_LED ; 如果A=B,跳转到BOTH_LED RIGHT_LED: MOV R2, #0x80 ; 把右LED的控制码存入R2 LDR R3, =0x101F1000 ; 把GPIO的地址存入R3 STR R2, [R3, #0x14] ; 把控制码写入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, #0x14] ; 把控制码写入GPIO数据寄存器 B END BOTH_LED: MOV R2, #0xA0 ; 把两个LED的控制码存入R2 LDR R3, =0x101F1000 ; 把GPIO的地址存入R3 STR R2, [R3, #0x14] ; 把控制码写入GPIO数据寄存器 END: B END ; 无限循环,改正,你自己在软件上运行一遍,全是错误
这段代码存在多个错误,需要进行改正:
1. 在代码的开头没有定义程序的起始位置(Entry Point),需要添加 ENTRY Reset。
2. 在比较指令 CMP 后面应该跟一个条件码,例如:CMP R0, R1 ; 如果A<B,跳转到RIGHT_LED
3. 在 BLT 和 BGT 指令后面没有添加 LABEL 标签,需要添加对应的标签名称。
4. 在 MOV 指令后面应该加上一个 # 符号,表示常数,例如:MOV R0, #5
5. 在 LDR 指令后面需要加上方括号来表示读取内存中的值,例如:LDR R3, =0x101F1000 应该改为 LDR R3, [ =0x101F1000 ]
6. 在 STR 指令后面需要加上方括号来表示写入内存中的值,例如:STR R2, [R3, #0x14] 应该改为 STR R2, [R3, #0x10]
改正后的代码如下:
```
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
```
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)