在 NEON armv8 程序集中存储指令

Posted

技术标签:

【中文标题】在 NEON armv8 程序集中存储指令【英文标题】:Store instruction in NEON armv8 assembly 【发布时间】:2020-12-07 18:54:01 【问题描述】:

我正在学习如何使用霓虹灯在 armv8 程序集中进行编程。 此代码可以编译,但在运行时冻结。

第一部分是创建变量的地方(array1),第二部分(Main)是代码开始的地方,就像入口点一样。

.data
array1: .word 30,70

ASM_FUNC(TEST)
.text

Main:
  mov x0,#11

  ldr x2,=array1  
  
  LD1 V0.2D, [x2] 

  ST1  V0.2D, [x0], #16
  

  ret

这是调用它的 C 代码

int TEST();

int main(void)

  printf("========== ASM Started ==========\n");
  long int ff = TEST();
  printf("=========== ASM has finished successfully ===========\n");
  return 0;

你看...它打印“ASM 已启动”,但从未到达“Asm 已完成”。当我评论ST1 V0.2D, [x0], #16 时,它工作得很好,但是当然,代码并没有做我需要它做的事情。 所以,我的问题是:我在这行代码中做错了什么?我是否以错误的方式分配了我的向量?我是不是用错了偏移量?

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:

此代码编译您使用的语言级别越低,该语句的相关性就越低。当您使用机器代码进行编程时,汇编器会将您的符号代码转换为相同的二进制形式;它不是编译器,它提供的任何错误检查都是为了它而不是你的!

你的汇编源代码可以收缩成:

  mov x0,#11
  ST1  V0.2D, [x0], #16

正如其他人在 cmets 中提到的那样,它试图存储在地址 11 (0xb) 处,该地址既未对齐,也可能未映射,因为接近零的地址可能未映射以帮助您找到错误。

【讨论】:

以上是关于在 NEON armv8 程序集中存储指令的主要内容,如果未能解决你的问题,请参考以下文章

在 ARMv8 程序集中将范围限制在 0 到 9 之间的随机数是啥?

在 ARMv8 环境中使用向量寄存器 (NEON) 的集合时,双精度不适用

ARM NEON指令集总结

ARMv8 NEON 向量置换

ARMv8 A64 程序集中的立即数范围

在 ARM Neon 程序集中使用 C 变量