这个问题涉及到 ARM
汇编语言。
我的问题是是否可以使用宏来替换 ASM 代码中的立即数,以便于我不必硬编码数字。
我不确定上面的问题是否清晰明了,因此我将提供一些带有 asm
代码的示例:
在 ARM
上存在一些指令,如 ror
指令(https://developer.arm.com/documentation/dui0473/m/arm-and-thumb-instructions/ror),其中可以使用一个寄存器值来旋转值,使其达到我们想要的效果:
#define rotate(number, ptr) ({ \
asm volatile( \
"ror %[output], %[output], %1\n" \
: [output]"+r"(ptr) \ // this is the in/output
: "r"(number)); \ // this is the rotator
})
现在,让我们来看一下 ARM(https://developer.arm.com/documentation/dui0473/m/arm-and-thumb-instructions/orr)中的 orr
指令。
语法如下:ORR{S}{cond} Rd, Rn, Operand2
其中Operand2
是一个灵活的操作数,意味着它可以是一个常量
或者带有可选移位的寄存器
(来源: https://www.keil.com/support/man/docs/armasm/armasm_dom1361289851539.htm)
所以像这样的东西就可以工作:
#define orr_test(ptr) ({ \
uint64_t __result; \
asm volatile (\
"orr %0, %1, #4 << 60\n"\
: "=r" (__result) : "r" (ptr)); \
__result; \
})
然而,我质疑代码行中的
#4
是否可以被替换为宏。这样一来,我就不必硬编码#4
了。但我认为这是不可能的(因为如果处理不当可能会引起严重问题),但我仍然想问一下,因为我在网上找不到相关信息。如果我上面提到的任何内容不清楚,请告诉我;谢谢。
编辑(根据要求):
以下是我希望的伪代码实现:
#define orr_test(ptr, number) ({ \
uint64_t __result; \
asm volatile (\
"orr %0, %1, %[num] << 60\n"\
: "=r" (__result) : "r" (ptr), [num]"r"(number)); \
__result; \
})
换句话说,我希望使用宏来确定要移动的数字,而不是需要在硬编码中写入
#4
。
orr %0, %1, %[num], LSL #60
. - Jester