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

问题描述 投票:3回答:2

我试图在程序集中使用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;
c gcc arm inline-assembly arm64
2个回答
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)
);

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位,所以从64位到32位的var addr转换将使程序核心转储。

© www.soinside.com 2019 - 2024. All rights reserved.