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

本文介绍了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

如果是 ARM 指令,将被 gnu 汇编器替换为单指令 mov r0,#0x00010000,对于 thumb 指令,尽管它可能仍然必须是 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](括号)有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,WP2

admin_action_{$_REQUEST[‘action’]}

do_action( "admin_action_{$_REQUEST[‘action’]}" )动作钩子::在发送“Action”请求变量时激发。Action Hook: Fires when an ‘action’ request variable is sent.目录锚点:#说明#源码说明(Description)钩子名称的动态部分$_REQUEST['action']引用从GET或POST请求派生的操作。源码(Source)更新版本源码位置使用被使用2.6.0 wp-admin/admin.php:...

日期:2020-09-02 17:44:16 浏览:1170

admin_footer-{$GLOBALS[‘hook_suffix’]}

do_action( "admin_footer-{$GLOBALS[‘hook_suffix’]}", string $hook_suffix )操作挂钩:在默认页脚脚本之后打印脚本或数据。Action Hook: Print scripts or data after the default footer scripts.目录锚点:#说明#参数#源码说明(Description)钩子名的动态部分,$GLOBALS['hook_suffix']引用当前页的全局钩子后缀。参数(Parameters)参数类...

日期:2020-09-02 17:44:20 浏览:1071

customize_save_{$this->id_data[‘base’]}

do_action( "customize_save_{$this->id_data[‘base’]}", WP_Customize_Setting $this )动作钩子::在调用WP_Customize_Setting::save()方法时激发。Action Hook: Fires when the WP_Customize_Setting::save() method is called.目录锚点:#说明#参数#源码说明(Description)钩子名称的动态部分,$this->id_data...

日期:2020-08-15 15:47:24 浏览:808

customize_value_{$this->id_data[‘base’]}

apply_filters( "customize_value_{$this->id_data[‘base’]}", mixed $default )过滤器::过滤未作为主题模式或选项处理的自定义设置值。Filter Hook: Filter a Customize setting value not handled as a theme_mod or option.目录锚点:#说明#参数#源码说明(Description)钩子名称的动态部分,$this->id_date['base'],指的是设置...

日期:2020-08-15 15:47:24 浏览:900

get_comment_author_url

过滤钩子:过滤评论作者的URL。Filter Hook: Filters the comment author’s URL.目录锚点:#源码源码(Source)更新版本源码位置使用被使用 wp-includes/comment-template.php:32610...

日期:2020-08-10 23:06:14 浏览:930

network_admin_edit_{$_GET[‘action’]}

do_action( "network_admin_edit_{$_GET[‘action’]}" )操作挂钩:启动请求的处理程序操作。Action Hook: Fires the requested handler action.目录锚点:#说明#源码说明(Description)钩子名称的动态部分$u GET['action']引用请求的操作的名称。源码(Source)更新版本源码位置使用被使用3.1.0 wp-admin/network/edit.php:3600...

日期:2020-08-02 09:56:09 浏览:877

network_sites_updated_message_{$_GET[‘updated’]}

apply_filters( "network_sites_updated_message_{$_GET[‘updated’]}", string $msg )筛选器挂钩:在网络管理中筛选特定的非默认站点更新消息。Filter Hook: Filters a specific, non-default site-updated message in the Network admin.目录锚点:#说明#参数#源码说明(Description)钩子名称的动态部分$_GET['updated']引用了非默认的...

日期:2020-08-02 09:56:03 浏览:864

pre_wp_is_site_initialized

过滤器::过滤在访问数据库之前是否初始化站点的检查。Filter Hook: Filters the check for whether a site is initialized before the database is accessed.目录锚点:#源码源码(Source)更新版本源码位置使用被使用 wp-includes/ms-site.php:93910...

日期:2020-07-29 10:15:38 浏览:834

WordPress 的SEO 教学:如何在网站中加入关键字(Meta Keywords)与Meta 描述(Meta Description)?

你想在WordPress 中添加关键字和meta 描述吗?关键字和meta 描述使你能够提高网站的SEO。在本文中,我们将向你展示如何在WordPress 中正确添加关键字和meta 描述。为什么要在WordPress 中添加关键字和Meta 描述?关键字和说明让搜寻引擎更了解您的帖子和页面的内容。关键词是人们寻找您发布的内容时,可能会搜索的重要词语或片语。而Meta Description则是对你的页面和文章的简要描述。如果你想要了解更多关于中继标签的资讯,可以参考Google的说明。Meta 关键字和描...

日期:2020-10-03 21:18:25 浏览:1729

谷歌的SEO是什么

SEO (Search Engine Optimization)中文是搜寻引擎最佳化,意思近于「关键字自然排序」、「网站排名优化」。简言之,SEO是以搜索引擎(如Google、Bing)为曝光媒体的行销手法。例如搜寻「wordpress教学」,会看到本站的「WordPress教学:12个课程…」排行Google第一:关键字:wordpress教学、wordpress课程…若搜寻「网站架设」,则会看到另一个网页排名第1:关键字:网站架设、架站…以上两个网页,每月从搜寻引擎导入自然流量,达2万4千:每月「有机搜...

日期:2020-10-30 17:23:57 浏览:1308