标签: arm

mrc p15 在 ARM 内联汇编中有什么作用,GNU C 内联汇编语法是如何工作的?

装配臂中的这条线有什么作用?

mrc p15, 0, %0, c9, c13, 0" : : "r" (counter)
Run Code Online (Sandbox Code Playgroud)

p15不是它应该是r15什么?

what is ::who arec9, c1每个论点的作用是什么?

assembly gcc arm inline-assembly

0
推荐指数
1
解决办法
2442
查看次数

在 x86 和 ARM 中移动内存的最佳方式?

我很想知道在 x86 架构上进行大容量内存复制的最佳方法。我意识到这取决于机器特定的特性。主要目标是过去 4-5 年制造的典型台式机。

我知道在过去,带有 REPE 的 MOVSD 名义上是最快的方法,因为您一次可以移动 4 个字节,但我已经读到,现在 MOVSB 一样快并且编写起来更简单,所以您也可以做一个字节移动并忘记 4 字节移动的复杂性。

一个周围的问题是 MOVxx 指令是否值得。如果 CPU 的运行速度比内存总线快得多,那么使用 CISC 移动可能毫无意义,您也可以使用普通的 MOV。这将是最有吸引力的,因为这样我就可以在其他处理器架构(如 ARM)上使用相同的算法。这带来了一个类似的问题,即 ARM 用于大容量内存移动的专用指令(与 Intel 完全不同)是否值得。


注意:我已阅读英特尔优化参考手册中的 3.7.6 节,因此我熟悉基础知识。我希望有人能将本手册内容以外的领域的实践经验联系起来。

optimization x86 assembly arm

0
推荐指数
1
解决办法
2425
查看次数

Scanf ARM 组件

我知道这里有一个问题但我真的不明白 OP 做了什么。我之前使用过 x86 程序集,为此你会做这样的事情:

push dword int1
push dword fmtInput
call scanf
add esp, 12
; value is now in int1
Run Code Online (Sandbox Code Playgroud)

我对 ARM 的猜测是这样的

ldr r0, fmtInput
push r1 @ says this is too complex, tried `ldr r1` but that also failed saying that ldr needed more inputs
bl scanf
@ I'm assuming the value is now in r1
Run Code Online (Sandbox Code Playgroud)

我确定我错过了一些简单的东西,但我真的很迷茫。如果 ldr 和 push 不起作用,那么还有其他一些操作码可以使用吗?如果其中之一是正确的,它需要什么样的输入组合?

我还尝试num: .word 0在 .data 部分定义 a并使用 .data 部分中的ldr r1, =num …

assembly arm scanf

0
推荐指数
1
解决办法
2万
查看次数

ARM IRQ 处理程序在 GCC 中无法正常工作

我正在使用 LPC2138 SoC 开发裸机 ARM 项目。我已经为 I2C 编写了一个 IRQ 中断处理程序。但它没有正确返回。为单个中断重复调用处理程序。

我对这个问题做了详细的调试分析。

在 ARM7TDMI 参考手册中,它清楚地提到了以下内容。

在此处输入图片说明 但是当我反汇编代码时,我发现GCC生成的代码并没有恢复CPSR寄存器。最后也是一个未知值。

在此处输入图片说明

我已经声明了如下的 IRQ 处理程序

void I2C0_IRQ_handler(void) __attribute__ ((interrupt("IRQ")));
Run Code Online (Sandbox Code Playgroud)

这是 GCC 中的错误还是我做错了什么?

我用于构建项目的编译器、汇编器和链接器标志是:

CFLAGS := -mcpu=arm7tdmi-s -g3 -Wall -I. -gdwarf-2
AS_FLAGS := -mcpu=arm7tdmi-s -g3 -gdwarf-2
LD_FLAGS := -Wl,-Map,$(TARGET:%.hex=%).map -nostartfiles
Run Code Online (Sandbox Code Playgroud)

c gcc arm

0
推荐指数
1
解决办法
854
查看次数

为 ARM 处理器编写操作系统

我最近为 x86 架构开发了一个非常简单的操作系统。但后来我意识到要为 ARM 板(如 RPi)以较小的规模构建它。

我想问一下,ARM指令集和x86有什么不同?

即使在 ARM 板上也有 BIOS 吗?如果没有,是否还有其他方法可以在屏幕或视频内存上打印输出?

要在 Raspberry Pi 上对操作系统进行编程,我需要做哪些更改?

一瞥我所知道的 - 我创建了一个简单的操作系统,它可以在屏幕上打印文字、从磁盘读取并将内核加载到内存中并切换到 32 位模式。

x86 operating-system arm raspberry-pi

0
推荐指数
1
解决办法
2989
查看次数

ASR和LSR的区别

右移有什么区别?我知道 ASL 和 LSL 是相同的,但我不知道 ASR 和 LSR 的区别,我尝试搜索但找不到可靠的答案。

linux arm

0
推荐指数
1
解决办法
6700
查看次数

:lower16, :upper16 用于 aarch64;绝对地址进入寄存器;

我需要将 32 位绝对地址放入 AArch64 上的寄存器中。(例如,MMIO 地址,与 PC 无关)。

在 ARM32 上,可以使用lower16&upper16将地址加载到寄存器中

movw    r0, #:lower16:my_addr
movt    r0, #:upper16:my_addr
Run Code Online (Sandbox Code Playgroud)

有没有办法通过使用在 AArch64 上做类似的事情movk

如果代码重定位,我仍然想要相同的绝对地址,所以adr不合适。

ldr 从附近的文字池中可以使用,但我宁愿避免这种情况。

assembly arm arm64

0
推荐指数
1
解决办法
1294
查看次数

使用不带参数的向前声明的C函数时,究竟是什么未定义?

摆弄C的旧奇怪兼容行为时,我最终得到了这段代码:

#include <stdio.h>
int f();
int m() {
    return f();
}
int f(int a) {
    return a;
}
int main() {
    f(2);
    printf("%i\n", m());
}
Run Code Online (Sandbox Code Playgroud)

我确定f()in 的调用m()是未定义的行为,因为f()应该只使用一个参数,但是:

  • 在x86上,除非使用GCC和-Wextra-Weverything否则GCC 9.1和clang 8.0.1均不显示任何警告(也不显示in 或其他内容)-O3。然后输出为2,不带-O30,带0。在Windows上,MSVC不会输出任何错误,程序只会输出随机数。
  • 在ARM(Raspberry Pi 3),GCC 6.3.0和clang 3.8.1上,我观察到相同的错误行为,该选项-O3仍输出0,但正常编译会导致GCC为2,而...则为66688。

当出现错误消息时,几乎是您所期望的:(非常有趣,因为a在打印行中没有出现)

foo.c: In function ‘m’:
foo.c:4:9: warning: ‘a’ is used uninitialized in this function [-Wuninitialized]
  return f();
         ^~~
foo.c: In function ‘main’:
foo.c:11:2: warning: ‘a’ is …
Run Code Online (Sandbox Code Playgroud)

c x86 gcc arm clang

0
推荐指数
1
解决办法
71
查看次数

Linux 内核在启动时无法从 SD 卡检测到 rootfs

我正在尝试手动构建主线内核并在 Pine64_Plus 板上启动。Linux 内核无法挂载启动分区。奇怪的是,它不会在引导日志中的可用分区下显示任何分区。我做了以下步骤。克隆linux主线git repo

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git --depth=1
Run Code Online (Sandbox Code Playgroud)

安装了交叉编译器工具链。

进而..

ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make defconfig
ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make -j4 Image
Run Code Online (Sandbox Code Playgroud)

生成dtb

ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make -j4 dtbs
Run Code Online (Sandbox Code Playgroud)

生成内核模块

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make -j4 modules
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=ker_mod_temp_dir make modules modules_install
Run Code Online (Sandbox Code Playgroud)

像下面这样对 SD 卡进行分区 在此处输入图片说明

我将 MLO、Uboot 和固件文件保存在引导分区中。

我从这里下载了 ArchLinux rootfs

我将下载的 rootfs 复制到我的 SD 卡的 ROOTFS 分区。

sudo cp -rT <path-to-downloaded-rootfs> /media/user/ROOTFS
Run Code Online (Sandbox Code Playgroud)

我将 linux 映像和 dts 文件夹从 /arch/arm64/boot 复制到 rootfs 中的引导文件夹。

我将内核模块复制到根目录

sudo cp -rT ker_mod_temp_dir /media/user/ROOTFS/lib
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我试图用 SD 卡启动电路板。uboot 启动成功。我在 …

linux boot arm linux-kernel embedded-linux

0
推荐指数
1
解决办法
2738
查看次数

如何制作多架构 Docker 镜像?

我为 CLI 实用程序创建了一个 Dockerfile,它在我的 Linux 笔记本电脑上运行良好。我尝试在安装了 Docker 的 Raspberry Pi 上运行容器,但它不起作用。

我知道无数公司创建图像来支持多种架构,他们是如何做到这一点的?

我想知道,因为我希望 CLI 的容器可以部署到 Raspberry Pi 以及我的 Linux 笔记本电脑。

linux x86 arm raspberry-pi docker

0
推荐指数
1
解决办法
552
查看次数