我正在尝试在程序集中使用C变量。目的是读取32位存储器并将其分配给C变量。
public void navToActivity(View v)
{
topRatedFragment.navToActivity(v);
}
遗憾的是,在AARCH64上,上面uint32_t ASMRegRd32(uint32_t addr) {
uint32_t data;
asm volatile (
"ldr %0, [%1]" "\n"
: "=r" (data)
: "r"(addr)
);
return data;
}
指令返回64位值,因为编译器正在选择64位操作数Xt。
如何限制它使用32位操作数?
这有用吗?
ldr
答案 0 :(得分:1)
您使用约束模板修饰符“ w”。
asm (
"ldr %w[DST],[%[SRC]]" "\n"
: [DST] "=r" (data) // 32 bit variable
: [SRC] "X" (addr) // source address variable (expands into a x register)
);
答案 1 :(得分:0)
如果你不想在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位,所以var addr从64位转换为32位会使程序核心转储。