aarch64 内联汇编错误:操作数 2 必须是整数寄存器——`ldnp x0,[x0]'

问题描述

我正在尝试使用内联汇编编写一个简单的函数并在 C 程序中使用它
mem_io_read一个函数,它绕过缓存读取内存地址(尽管地址位于可缓存的内存区域中)。适用于 aarch64 机器。

static inline int mem_io_read(unsigned long paddr)
{
    unsigned long val;
    register pa;
    __asm__ __volatile__("mov %0,%1\n\t" : "=r" (pa) : "r"(paddr));   <-- move paddr to a register pa
    __asm__ __volatile__("ldnp %0,[%1]\n\t" : "=r" (val) : "r" (pa));   <-- load data from addr in pa
    return val;
}

main()
{
...
  uint32_t SCP_WR_ADDR     = &scp_wait; // where test1val was located. //x06000000;
  uint32_t chk_scp_rd_data = 0;

  // Send flag for proceeding SCP test
  (*(volatile uint32_t *)(SCP_WR_ADDR)) = 0x87654321;   <-- send signal to the other processor (scp)

  // Receives flag from SCP
  while(chk_scp_rd_data != 0x12345678)   <--- read back until the value is changed (reverse order)
  {
     chk_scp_rd_data = mem_io_read(SCP_WR_ADDR);
  }
}

当我使用 gcc 编译它时,出现此错误

/tmp/ccCpQGc5.s: Assembler messages:
/tmp/ccCpQGc5.s:26: Error: operand 2 must be an integer register -- `ldnp x0,[x0]'

我无法弄清楚这里出了什么问题。请帮忙。

ADD :根据 Peter Cordes 的评论,我将其更改为这个。编译正常。

static int inline mem_io_read(unsigned long paddr)
{
    int val,val1;
    __asm__ __volatile__("ldnp %0,%1,[%2]\n\t" : "=r" (val),"=r" (val1) : "r" (paddr) : "memory");
    return val;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)