【发布时间】:2015-11-16 18:40:42
【问题描述】:
我正在尝试在汇编中使用 C 变量。目的是读取一个 32bit 的内存,并赋值给一个 C 变量。
uint32_t ASMRegRd32(uint32_t addr) {
uint32_t data;
asm volatile (
"ldr %0, [%1]" "\n"
: "=r" (data)
: "r"(addr)
);
return data;
}
遗憾的是,在 AARCH64 上,ldr 指令返回一个 64 位值,因为编译器正在选择一个 64 位操作数 Xt。
如何限制它使用 32 位操作数?
这应该工作吗?
ldr w0, [%1];
mov %0, w0;
【问题讨论】:
-
你的意思是
ldr %w0, [%1]?因为看起来您正在尝试使用x86 Operand Modifiers。我不会说 aarch64(根本不会),但我很确定 x86 修饰符在这里不起作用。如果你这样做(说 aarch64 汇编器),你可以尝试浏览实际的 gcc code 以获取约束。也许你会在那里看到一些你可以使用的东西。 -
您需要写
%w0而不是只写%0才能得到w0而不是x0。 Clang 应该得到一个警告告诉 -
是的,我的意思是 %w0。它奏效了。谢谢。
标签: c gcc arm inline-assembly arm64