在 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 之间的随机数是啥?