c - 预计 GCC ARM 寄存器

标签 c gcc assembly arm inline-assembly

我正在尝试移植 bunny到 armv7h,它使用了一些我在转换为 asm 时遇到问题的 x86 asm 东西。

static __inline__ void atomic_inc(volatile int* ptr){
    __asm__ __volatile__("lock incl %0": "=m" (*ptr): "m" (*ptr));
}    

static __inline__ void atomic_dec(volatile int* ptr){
    __asm__ __volatile__("lock decl %0": "=m" (*ptr): "m" (*ptr));
}

有什么办法吗,我试过了

"ADD/SUB %0 %0": "=r" (*ptr): "m" (*ptr));

两者都给

Error: ARM register expected -- `add [r3] [r3]'

Error: ARM register expected -- `sub [r4] [r4]'

编译使用:

armv7l-unknown-linux-gnueabihf-gcc -Wall -O3 -funroll-loops -fno-strict-aliasing
-ffast-math -Wno-pointer-sign -mcpu=cortex-a15 -mfpu=neon -marm

最佳答案

线索就在错误消息中——完全准确。

ARM算术指令占用三个operands :

ADD{S} rd, rs, <operand>

SUB{S} rd, rs, <operand>

在哪里operand是其中之一:

  • 注册
  • 立即值
  • 按常数移位的寄存器
  • 一个寄存器被另一个寄存器移位

在你的例子中,我想你会想要一个立即数 1 , 这将给出

的汇编程序指令

ADD rd, rd, #1

但是,这忽略了您试图实现内存位置 原子增量的根本缺陷。编译器正在从内存指令中生成加载,以实现对 ptr 的取消引用。 .它不是很明显它曾经生成结果的存储。即使是这样,这也最多是 3 条指令(加载、递增、存储)的非原子序列。

我建议查看 GCC's atomic intrinsics而不是自己滚动。

关于c - 预计 GCC ARM 寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23979193/

相关文章:

gcc - 如何使用 GCC 或 llvm 编译 Intel VNNI 指令?

windows - GetProcAddress 不返回 LoadLibraryA 的真实地址

assembly - 我们看到一个进程的虚拟地址(在分页系统中),这些虚拟地址存在哪里?

c - 为什么我的数组没有正确存储结构?

c - c代码有什么问题吗?

c - strstr 未返回所需结果

c - 如果我在 C 程序中用 #define 或 const 声明常量会出错

C fopen模式读+写+创建

c++ - 与子构造函数同名的继承类成员

linux - 我有一个问题。汇编和 gdb 新手