【问题标题】:Store instruction in NEON armv8 assembly在 NEON armv8 程序集中存储指令
【发布时间】: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 时,它工作得很好,但是当然,代码并没有做我需要它做的事情。 所以,我的问题是:我在这行代码中做错了什么?我是否以错误的方式分配了我的向量?我是不是用错了偏移量?

【问题讨论】:

标签: assembly arm arm64 neon armv8


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2016-12-02
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多