相关疑难解决方法(0)

为什么在ARM汇编中使用LDR而不是MOV(反之亦然)?

我正在浏览本教程:http://www.cl.cam.ac.uk/freshers/raspberrypi/tutorials/os/ok01.html

第一行组装是:

ldr r0,=0x20200000
Run Code Online (Sandbox Code Playgroud)

第二个是:

mov r1,#1
Run Code Online (Sandbox Code Playgroud)

我以为ldr是将值从内存加载到寄存器中.但似乎=意味着0x20200000是一个值而不是内存地址.两条线似乎都在加载绝对值.

assembly arm

25
推荐指数
3
解决办法
3万
查看次数

ARMv6程序集中= label(等号)和[label](括号)之间有什么区别?

我正在跟随剑桥大学的Baking Pi课程,其中一个简单的操作系统是在ARMv6指令集中构建的,目标是Raspberry Pi.

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

所以我使用的东西ldr r0,=0x20200000,我实际上理解为"将存储在存储单元0x20200000的数据读入寄存器r0.

然后我用过以下的东西:

ldr r0,[r1,#4]
Run Code Online (Sandbox Code Playgroud)

我已经理解为"读取存储在r1指向的存储器地址的数据,以4字节的偏移量进入寄存器r0".

然后我遇到了这个:

ldr r0,=pattern
ldr r0,[r0]
Run Code Online (Sandbox Code Playgroud)

pattern这里是一个.int.data部分(表示接通/断开状态的用于LED的序列的位图).我在阅读本文时意识到,我之前的理解=foo一定是错的,否则上述两条指令都会做同样的事情.

=x语法基本都像在C的指针,而[x]语法如果被指向的内存x实际上是读?

让我们说ptr下面的C是一个int*,我的评论是否考虑等效组装(概念上,不是字面意思)有意义吗?

r0 = ptr;     /* equivalent to: ldr r0,=ptr     */
r0 = *ptr;    /* equivalent to: ldr r0,[ptr]    */
r0 = *(ptr+4) /* equivalent to: ldr r0,[ptr,#4] */
Run Code Online (Sandbox Code Playgroud)

assembly arm

17
推荐指数
1
解决办法
7101
查看次数

Intel x86到ARM汇编转换

我目前正在学习ARM汇编语言;

为此,我试图将一些转换x86 code (AT&T Syntax)为ARM汇编(Intel Syntax)代码.

__asm__("movl $0x0804c000, %eax;");

__asm__("mov R0,#0x0804c000");
Run Code Online (Sandbox Code Playgroud)

从这个文档中,我了解到在x86中,堆结构的Chunk 1从0x0804c000开始.但是当我尝试同样的操作时arm,我收到以下错误:

/tmp/ccfNZp9F.s:174: Error: invalid constant (804c000) after fixup
Run Code Online (Sandbox Code Playgroud)

我假设问题是ARM只能加载32位指令.

Question 1: Any idea what would be the first chunk in case of ARM processors?


Question 2:
Run Code Online (Sandbox Code Playgroud)

从我之前的问题,我知道内存间接寻址是如何工作的.

下面写的片段是否做同样的工作?

movl (%eax), %ebx

LDR R0,[R1]
Run Code Online (Sandbox Code Playgroud)

我在用 ARMv7 Processor rev 4 (v7l)

c x86 arm intel-syntax

5
推荐指数
2
解决办法
6440
查看次数

标签 统计

arm ×3

assembly ×2

c ×1

intel-syntax ×1

x86 ×1