如何在Assembly中使用STR和LDR

2q5ifsrm  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(152)

我是一个新手在组装和我不能解决一个问题我的老师给我,我只是想我做错了什么的解释。基本上我要做的是保存在R0的数字65(十进制),在R1 1B001B00(十六进制)(这部分是没有错,因为它编译,但如果你有任何建议,更好的方法来做它,我会很高兴)

  • (未编译的部分)* 将R0存储在地址0x20000040中,将R1存储在0x20000044中,最后将地址0x20000040中的内容加载到R7中

下面是我到目前为止编写的代码:

MOV R0, #65
MOV R1, #0x1B00
MOVT R1, #0x1B00
STR R0, 0x20000040
STR R1, 0x20000044
LDR R7, 0x20000040

我得到的错误是
错误的符号,未定义或在外部

snvhrwxg

snvhrwxg1#

ARM架构不支持直接寻址。相反,您必须将地址加载到寄存器中,然后使用变址寻址模式。
例如,您可以执行:

MOV R2, #0x20000000
STR R0, [R2, #0x40]  @ 0x20000000 + 0x40 = 0x20000040
STR R1, [R2, #0x44]  @ 0x20000000 + 0x44 = 0x20000044
LDR R7, [R2, #0x40]

我们将地址分为0x20000000和2个小偏移量,因为ARM mov-immediate只能对某些类型的常量进行编码,例如按任意偶数计数循环的8位值。(两个相邻地址中的一个)设置了10位的位,所以如果你想这样,你可以做ldr r2, =0x20000040,让汇编程序来计算如何把它放到寄存器中。
你可以用R7来保存地址,你会用最后一次加载来覆盖它,所以如果你想避免使用任何超出指定的临时寄存器,这就可以了。

相关问题