装配臂中的这条线有什么作用?
mrc p15, 0, %0, c9, c13, 0" : : "r" (counter)
Run Code Online (Sandbox Code Playgroud)
谁p15不是它应该是r15什么?
what is ::who arec9, c1每个论点的作用是什么?
我很想知道在 x86 架构上进行大容量内存复制的最佳方法。我意识到这取决于机器特定的特性。主要目标是过去 4-5 年制造的典型台式机。
我知道在过去,带有 REPE 的 MOVSD 名义上是最快的方法,因为您一次可以移动 4 个字节,但我已经读到,现在 MOVSB 一样快并且编写起来更简单,所以您也可以做一个字节移动并忘记 4 字节移动的复杂性。
一个周围的问题是 MOVxx 指令是否值得。如果 CPU 的运行速度比内存总线快得多,那么使用 CISC 移动可能毫无意义,您也可以使用普通的 MOV。这将是最有吸引力的,因为这样我就可以在其他处理器架构(如 ARM)上使用相同的算法。这带来了一个类似的问题,即 ARM 用于大容量内存移动的专用指令(与 Intel 完全不同)是否值得。
注意:我已阅读英特尔优化参考手册中的 3.7.6 节,因此我熟悉基础知识。我希望有人能将本手册内容以外的领域的实践经验联系起来。
我知道这里有一个问题,但我真的不明白 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 …
我正在使用 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) 我最近为 x86 架构开发了一个非常简单的操作系统。但后来我意识到要为 ARM 板(如 RPi)以较小的规模构建它。
我想问一下,ARM指令集和x86有什么不同?
即使在 ARM 板上也有 BIOS 吗?如果没有,是否还有其他方法可以在屏幕或视频内存上打印输出?
要在 Raspberry Pi 上对操作系统进行编程,我需要做哪些更改?
一瞥我所知道的 - 我创建了一个简单的操作系统,它可以在屏幕上打印文字、从磁盘读取并将内核加载到内存中并切换到 32 位模式。
右移有什么区别?我知道 ASL 和 LSL 是相同的,但我不知道 ASR 和 LSR 的区别,我尝试搜索但找不到可靠的答案。
我需要将 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 从附近的文字池中可以使用,但我宁愿避免这种情况。
摆弄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()应该只使用一个参数,但是:
-Wextra,-Weverything否则GCC 9.1和clang 8.0.1均不显示任何警告(也不显示in 或其他内容)-O3。然后输出为2,不带-O30,带0。在Windows上,MSVC不会输出任何错误,程序只会输出随机数。-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) 我正在尝试手动构建主线内核并在 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)
我将 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 启动成功。我在 …
我为 CLI 实用程序创建了一个 Dockerfile,它在我的 Linux 笔记本电脑上运行良好。我尝试在安装了 Docker 的 Raspberry Pi 上运行容器,但它不起作用。
我知道无数公司创建图像来支持多种架构,他们是如何做到这一点的?
我想知道,因为我希望 CLI 的容器可以部署到 Raspberry Pi 以及我的 Linux 笔记本电脑。
arm ×10
assembly ×4
x86 ×4
gcc ×3
linux ×3
c ×2
raspberry-pi ×2
arm64 ×1
boot ×1
clang ×1
docker ×1
linux-kernel ×1
optimization ×1
scanf ×1