C汇编中的变量用法,如何在arm aarch64中选择32位操作数

时间:2015-08-23 06:00:52

标签: c gcc arm inline-assembly arm64

我正在尝试在程序集中使用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

2 个答案:

答案 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位会使程序核心转储。