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