ARMv6 汇编中的 =label(等号)和 [label](括号)有什么区别? [英] What is the difference between =label (equals sign) and [label] (brackets) in ARMv6 assembly?

查看:28
本文介绍了ARMv6 汇编中的 =label(等号)和 [label](括号)有什么区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在关注 Baking Pi 剑桥大学的课程,其中在 ARMv6 指令集中构建了一个简单的操作系统,针对 Raspberry Pi.

I'm following along with the Baking Pi course from Cambridge University, in which a simple operating system is built in the ARMv6 instruction set, targeting the Raspberry Pi.

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

We've been using two ways of loading data into registers via the ldr instruction so far and I realize now that I'm using them together, I don't fully understand what they both do.

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

So I've used things like ldr r0,=0x20200000, which I actually understood as "read the data stored at the memory location 0x20200000 into register r0.

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

Then I've used things like:

ldr r0,[r1,#4]

我理解为将存储在 r1 指向的内存地址处的数据以 4 个字节的偏移量读取到寄存器 r0 中".

Which I've understood as being "read the data stored at the memory address pointed to by r1, at an offset of 4 bytes, into register r0".

然后我遇到了这个:

ldr r0,=pattern
ldr r0,[r0]

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

pattern here is a .int in the .data section (a bitmap representing a sequence of on/off states for an LED). I realize upon reading this, that my previous understanding of =foo must be wrong, otherwise both of the above instructions would do the same thing.

=x 语法基本上更像 C 中的指针,而 [x] 语法就好像 指向的内存x居然被读取了?

Is the =x syntax basically more like a pointer in C, while the [x] syntax is as if the memory that is being pointed to by x is actually read?

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

Let's say ptr in the C below is an int*, do my comments thinking about equivalent assembly (conceptually, not literally) make any sense?

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:

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

means load the address of the label something into the register r0. The assembler then adds a word somewhere in reach of the ldr instruction and replaces it with a

ldr r0,[pc,#offset]

说明

所以这个快捷方式

ldr r0,=0x12345678

表示将 0x12345678 加载到 r0 中.

means load 0x12345678 into r0.

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

being mostly fixed length instructions, you cant load a full 32 bit immediate into a register in one instruction, it can take a number of instructions to completely load a register with a 32 bit number. Depends heavily on the number. For example

ldr r0,=0x00010000

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

will get replaced by the gnu assembler with a single instruction mov r0,#0x00010000 if it is an ARM instruction, for a thumb instruction though it may still have to be ldr r0,[pc,#offset]

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

These ldr rd,=things are a shortcut, pseudo instructions, not real.

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

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

are real instructions and mean read from memory at address rm+offset or rm+rn and take the value read and put it in the register rd

=something 更像是 C 中的 &something.

the =something is more like &something in C.

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

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

并在汇编中

something:
    .word 0

ldr r0,=something
ldr r1,[r0]

这篇关于ARMv6 汇编中的 =label(等号)和 [label](括号)有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆