微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。