gpt4 book ai didi

assembly - ARMv6 汇编中=label(等号)和[label](括号)有什么区别?

转载 作者:行者123 更新时间:2023-12-02 13:46:45 25 4
gpt4 key购买 nike

我正在关注 Baking Pi剑桥大学的类(class),其中基于 ARMv6 指令集构建了一个简单的操作系统,针对 Raspberry Pi。

到目前为止,我们一直在使用两种通过 ldr 指令将数据加载到寄存器中的方法,现在我意识到我正在一起使用它们,但我并不完全理解它们的作用.

所以我使用了诸如ldr r0,=0x20200000之类的东西,我实际上将其理解为“将存储在内存位置0x20200000的数据读取到寄存器r0中。

然后我使用了类似的东西:

ldr r0,[r1,#4]

我将其理解为“将存储在 r1 指向的内存地址处的数据(偏移量为 4 个字节)读入寄存器 r0”。

然后我遇到了这个:

ldr r0,=pattern
ldr r0,[r0]

pattern 这里是 .data 部分中的 .int(表示 LED 开/关状态序列的位图) 。读到这里我意识到我之前对 =foo 的理解一定是错误的,否则上面的两条指令都会做同样的事情。

=x 语法基本上更像是 C 中的指针,而 [x] 语法就像 所指向的内存x 实际上被读取了吗?

假设下面的 C 中的 ptr 是一个 int*,我关于等效汇编的评论(概念上,而不是字面意思)有意义吗?

r0 = ptr;     /* equivalent to: ldr r0,=ptr     */
r0 = *ptr; /* equivalent to: ldr r0,[ptr] */
r0 = *(ptr+4) /* equivalent to: ldr r0,[ptr,#4] */

最佳答案

ldr r0,=something
...
something:

表示将标签something的地址加载到寄存器r0中。然后,汇编器在 ldr 指令范围内的某处添加一个单词,并将其替换为

ldr r0,[pc,#offset]

说明

所以这个快捷方式

ldr r0,=0x12345678

表示将0x12345678加载到r0中。

由于指令大多是固定长度的,因此您无法在一条指令中将完整的 32 位立即数加载到寄存器中,可能需要多条指令才能完全加载具有 32 位数字的寄存器。很大程度上取决于数量。例如

ldr r0,=0x00010000

如果是 ARM 指令,则将被 gnu 汇编器替换为单条指令 mov r0,#0x00010000,对于拇指指令,尽管它可能仍然必须是 ldr r0,[pc,#offset]

这些 ldr rd,=things 是快捷方式、伪指令,而不是真实的。

ldr rd,[rm,#offset]
ldr rd,[rm,rn]

是真正的指令,意味着从地址 rm+offset 或 rm+rn 处的内存读取,并将读取的值放入寄存器 rd

=something 更像是 C 语言中的 &something。

unsigned int something;
unsigned int r0;
unsigned int r1;

r0 = &something;
r1 = *(unsigned int *)r0;

以及组装中

something:
.word 0

ldr r0,=something
ldr r1,[r0]

关于assembly - ARMv6 汇编中=label(等号)和[label](括号)有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17214962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com