assembly - 装配中立即超出范围
问题描述
当我编译代码时
"VMOV.I16 q1, #2730; "
我有一个错误
Error: immediate out of range
这个错误的原因可能是什么?我知道 S16 在 [-32768,32767] 内,如果我在寄存器 Q 或 D 中存储常量 2730 该怎么办?谢谢!
解决方案
每条 ARM 指令都是 32 位宽的,并且只有有限数量的位专用于立即值 - 如果有的话。
2730 是十六进制的 0xaaa,如您所见,您需要 11 位来表示文字,并且vmov
只接受 8 位和两位左移: 8bit<<(n*8); 其中 n 可以是 0 到 3
将任何 16 位值加载到 NEON 寄存器中的最佳方法是(在您的情况下为 2730):
movw %[temp], #2730
vdup.16 q1, %[temp]
movw
是接受 16 位文字的 ARM 指令,并且是 NEON 指令,除了源操作数是 ARM 整数寄存器而不是立即值之外vdup.n
,它的作用相同。vmov.in
替代方式:
您可以将任何 8 位值加载到 NEON 寄存器中;您使用值 0xaa 进行 8 位加载,然后清除 16 位值的最高有效四位
vmov.i8 q1, #0xaa
vbic.i16 q1, q1, #0xf000
但是请注意,这仅是因为在您的情况下,位 16~19 与位 0~3 相同。
推荐阅读
- mysql - 同一张表上有多个 COUNT
- pandas - TypeError:只能将 str(不是“列表”)连接到 str - pandas
- php - 事务在插入查询中无法正常工作
- html - 我想在 Reactjs 中添加 addEventListener() 如果我点击这个模型之外,模型就会关闭
- java - 如何将随机数分配给按钮 [5][5] 的矩阵。从1到25的数字请回答
- docker - SignalR .NetCore Api 在使用 docker-compose 运行时不起作用
- java - java servlet 上的 Tomcat 404
- javascript - Promise.all() 在完成之前停止工作
- python - 如何在python中使用selenium webdriver从网页中提取Total Confirmed的信息
- php - 获取数组对象的最大值