我试图在程序集中使用C变量。目的是读取32位存储器并将其分配给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;
您使用约束模板修饰符“w”。
asm (
"ldr %w[DST],[%[SRC]]" "\n"
: [DST] "=r" (data) // 32 bit variable
: [SRC] "X" (addr) // source address variable (expands into a x register)
);
如果您不想在A32编译器中重新编译代码,也许应该像下面那样更改API。
uint32_t ASMRegRd32(uint64_t addr) {
uint32_t data;
asm volatile (
"ldrh w0, [%1]\n"
: "=&r" (data)
: "r"(addr)
: "cc"
);
return data;
}
因为默认寄存器是64位,所以从64位到32位的var addr转换将使程序核心转储。