问题标签 [armasm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
arm - NEON SSUBL 指令有错误的结果?127-220 = 0x00a3(应该是 0xffa3)
ssubl
在 A64 指令集中使用指令时出现问题。
我只想从 8 字节 SIMD 向量中减去一个常数值。由于结果可能包含负数,我使用它ssubl
来扩展数据范围并进行有符号减法。
这是我的代码:
我检查了向量寄存器 v1、v2 和 v3 中的结果:
- v1:全部为 0x7f(十进制 127)
- v2:全部为 0xdc(十进制 220)
- v3:全部为 0x00a3(十进制 163),错误
[127 - 220 = -93 (0xffa3),正确]
我认为 v3 中的值应该是 0xff5d,因为它是一个负数。但为什么不是呢?
实际上,经过几次测试,我发现这个问题与 中的值无关w5
,无论是 220 还是 230 或其他值。只要 in 的值w4
小于等于 127,减法结果就不正确。
因此,如果我们使用相同的代码,但将 w4 值更改为 128 或更大:
现在的结果是:
- v1:全部为 0x80(十进制 128)
- v2:全部为 0xdc(十进制 220)
- v3:全部为 0xffa4(十进制 -92),正确
[128 - 220 = -92 (0xffa4),正确]
现在结果是正确的,我也尝试使用 150, 250 in w5
,所有结果都是正确的。问题仅与 中的值有关w4
。
有没有人可以解释一下?
谢谢!
c++ - Armv8 汇编器优化
您好,我在 Raspberry Pi 3 上完成了我的第一个汇编程序实现。我想问您如何改进算法。它基本上应该做的是:在一个 320x240 uint8_t 数组中,它分析每个点并从中创建两个位掩码。位掩码是通过将中心点与半径为 3 的圆上的圆角像素进行比较来创建的。如果该圆上的像素小于中心减去阈值,则 regLO 掩码得到 1,否则为 0。如果该圆上的像素大于中心加上阈值,则 regHI 为 1,否则为 0。每次比较后,regHi 和 regLO 都移动一个。这样我们最终得到一个像素越来越低的位掩码。该算法为 FAST-9 算法奠定了基础。
[编辑]:我知道 c++/c 代码与我的汇编代码类似(实际上在 c++ 中需要 19 毫秒,在汇编中需要 17 毫秒)。但我正在学习汇编程序。我也知道 SIMD 更快,但我想先学习基本的汇编程序。
[EDIT2]:添加了 c++ 和 SIMD 实现
[c++]
[SIMD 或 NEON 本能]
如果您能指出我可以对该代码进行的一些优化以使其运行得更快,那就太好了
汇编程序的执行时间为 17 毫秒 c/c++ 与 O2 标志:19 毫秒 SIMD:44 毫秒
sorting - “访问未对齐的内存位置,地址错误=ffffff”
我正在尝试从 input.txt 文件中读取整数,下面是我的读取循环,我正在尝试读取整数并将其存储到数组中。我在使用 ARM SIM 的“LDR R2,[R2,R5,LSL #2]...im做错了吗?
c++ - SEGFAULT 写入堆栈变量
我在 ARM linux 平台上遇到了一个由简单代码引起的非常奇怪的崩溃。问题是它很少重现(每天一次),另一个问题是它在实际上不能崩溃的地方崩溃。
让我们从 C++ 代码开始。线程函数这样做:
engine
是指向目前只有一个实现的基本抽象类的指针。getEvents 是纯虚方法。
getEvents
经过一些更改后,除了这个什么都不做
尝试在 num 中存储 0 时发生 SEGFAULT。首先我认为这是堆栈损坏,但在我检查生成的汇编代码之后,似乎没有任何东西存储在堆栈中。这种方法甚至没有生成堆栈保护(启用-fstack-protector-strong),两个参数都存储在寄存器r1和r2中。让我们看一下函数调用的代码:
以及函数本身的代码:
从生成的代码中可以看出,指针被放入 intr1
和r2
寄存器。
即使堆栈损坏,它也可能损坏num
变量的值,但是它如何损坏寄存器中的指针呢?同样从崩溃日志中我可以看到LR
地址是错误的。
CRASH 信号 11 分段故障地址 0xf0000000 PC 0x251fe LR 0x6c3c533c
从这里我唯一看不到的是跳转的地址(blx r3),因为调用的方法是虚拟的。我有一个非常不可能的假设,即不是跳转到虚拟方法主体的第一行,而是在此之前跳转到几行并损坏了寄存器,但我不明白这怎么可能。即使在更改代码之后,它也总是在同一行崩溃。这很奇怪。
有人可以建议尝试一下吗?有任何想法吗?
提前致谢。
arrays - Arm Asm 双寄存器立即数
我有一个任务需要用 armasm 编写的 Ln 算法。我决定使用 BKM 算法。该算法使用查找表。该作业还需要在 asm 中实现查找表。问题是我在编译时遇到了 immediateOutOfBounds 错误或garbageFollowingInstruction 错误,即使是像VMOV.f64 d2, #0.0这样的立即数。在我的其他 asm-Functions 这些操作工作正常
这是代码:
提前致谢
arm - 如何在 gnu 汇编程序中使用 TBB 指令(Cortex-M3)?
Arm通用用户指南(第 172 页)的第 3.10.4 节给出了使用 TBB 的示例,但该示例使用 Arm 汇编程序。我想学习如何将 TBB 与气体一起使用,但似乎无法弄清楚如何。我应该如何修改指南中的示例以使用 gas 而不是 armasm 实现 switch 语句?
我是使用 gas 的新手,我不确定是否应该在汇编文件开头的 .data 部分中定义分支表,或者是否应该在 .text 部分中的 switch 语句之后。
ffmpeg - 使用 Microsoft Visual Studio 2017 预览版为 windows10/aarch64 编译 FFmpeg 时出错
我正在尝试使用 Microsoft Visual Studio 2017 Preview 社区版为 Windows10/Aarch64 配置编译 FFmpeg(Chromium 版本)。我在汇编文件中遇到错误,如下所示(突出显示的几个错误)。我相信 FFmpeg 已经适用于 Linux/Aarch64 配置(可能使用 GNU 汇编器),在这种情况下,相同的汇编代码也应该适用于 Microsoft ARM 宏汇编器。如果我在这里遗漏任何内容以及任何有助于解决错误的指针,请告诉我。
D:\Work\Chromium_FFmpeg\chromium\src>ninja -C out\ARM64V8 third_party\ffmpeg ninja: 进入目录 `out\ARM64V8' [2/9] ASM obj/third_party/ffmpeg/ffmpeg_internal/autorename_libavcodec_aarch64_fft_neon.obj FAILED: obj/第三方/ffmpeg/ffmpeg_internal/autorename_libavcodec_aarch64_fft_neon.obj D:/Work/Chromium_FFmpeg/depot_tools/win_tools-2_7_6_bin/python/bin/python.exe ../../build/toolchain/win/tool_wrapper.py asm-wrapper environment.arm64 armasm64.exe /Foobj/third_party/ffmpeg/ffmpeg_internal/autorename_libavcodec_aarch64_fft_neon.obj ../../third_party/ffmpeg/libavcodec/aarch64/autorename_libavcodec_aarch64_fft_neon.S Microsoft (R) ARM Macro Assembler Version 14.16.26926.0 for 64 bits D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\autorename_libavcodec_aarch64_fft_neon.S(1) :错误 A2003: 不正确的行语法: / // 文件自动生成。请参阅 crbug.com/495833。D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\autorename_libavcodec_aarch64_fft_neon.S(2) : error A2230: Illegal preprocessor directive; 仅识别“#line [文件名]” 包括 "fft_neon.S" D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\autorename_libavcodec_aarch64_fft_neon.S(3) :警告 A4045:缺少 END 指令包括 "fft_neon.S" 。. . [6/9] ASM obj/third_party/ffmpeg/ffmpeg_internal/mpegaudiodsp_neon.obj 失败:obj/third_party/ffmpeg/ffmpeg_internal/mpegaudiodsp_neon.obj D:/Work/Chromium_FFmpeg/depot_tools/win_tools-2_7_6_bin/python/bin/python.exe ../../build/toolchain/win/tool_wrapper.py asm-wrapper environment.arm64 armasm64.exe /Foobj/third_party/ffmpeg/ffmpeg_internal/mpegaudiodsp_neon.obj ../../third_party/ffmpeg/libavcodec/aarch64/ mpegaudiodsp_neon.S Microsoft (R) ARM Macro Assembler Version 14.16.26926.0 for 64 bits D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(1) :错误 A2003:不正确的行语法:/ /* D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(2):错误 A2079:行语法不正确;预期符号 * 版权所有 (c) 2014 Janne Grunau D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(3):错误 A2079:行语法不正确;预期符号 * D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(4):错误 A2079:行语法不正确;预期符号 * 此文件是 FFmpeg 的一部分。D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(5):错误 A2079:行语法不正确;预期符号 * D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(6):错误 A2079:行语法不正确;预期符号 * FFmpeg 是免费软件;您可以重新分发它和/或 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(7):错误 A2079:行语法不正确;预期符号 * 根据 GNU Lesser General Public D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(8) 的条款对其进行修改:错误 A2079:行语法不正确;预期符号 * 由自由软件基金会发布的许可证;D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(9):错误 A2079:行语法不正确;符号预期 * 许可证的 2.1 版,或(由您选择)任何更高版本。D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(10):错误 A2079:行语法不正确;预期符号 * D: \Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(11):错误 A2079:行语法不正确;符号预期 * FFmpeg 分发是希望它有用,D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(12) : 错误 A2079: 行语法不正确;符号预期 * 但没有任何保证;甚至没有 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(13) 的默示保证:错误 A2079:行语法不正确;预期符号 * 适销性或特定用途的适用性。请参阅 GNU D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(14):错误 A2079:行语法不正确;预期符号 * 小通用公共许可证了解更多详细信息。丁:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(15):错误 A2079:行语法不正确;预期符号 * D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(16):错误 A2079:行语法不正确;预期符号 * 您应该已收到 GNU Lesser General Public D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(17) 的副本:错误 A2079:行语法不正确;预期符号 * 与 FFmpeg 一起获得许可证;如果没有,请写入自由软件 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(18):错误 A2079:行语法不正确;预期符号 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA D: \Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(19):错误 A2079:行语法不正确;预期符号 */ D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(21):错误 A2230:非法预处理器指令;仅识别“#line [文件名]”包括“libavutil/aarch64/asm.S” D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(23):错误 A2230:非法预处理程序指令; 仅识别“#line [文件名]”定义 FRAC_BITS 23 // sb_samples 和 dct 的小数位 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(24) : 错误 A2230:非法的预处理器指令;只有“#line [文件名]” 已识别为窗口 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(25) 定义 WFRAC_BITS 16 // 小数位:错误 A2230:非法预处理器指令;仅识别“#line [文件名]”定义 OUT_SHIFT (WFRAC_BITS + FRAC_BITS - 15) D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(27):错误 A2034:未知操作码: tbl_rev128_s const tbl_rev128_s, align=4 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(28) :错误 A2034:未知操作码:。 .byte 12、13、14、15 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(29):错误 A2034:未知操作码:。.byte 8、9、10、11 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(30):错误 A2034:未知操作码:。.byte 4, 5, 6, 7 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(31):错误 A2034:未知操作码:。.byte 0, 1, 2, 3 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(34):错误 A2003:不正确的行语法:。.macro apply_window 类型,st D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(35) :错误 A2034:未知操作码:ff_mpadsp_apply_window_ 函数 ff_mpadsp_apply_window_\type()_neon,export=1 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(42):错误 A2034:未知操作码: movrel movrel x15, tbl_rev128_s D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(44) : 错误 A2003: 不正确的行语法: . .ifc \type,已修复 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(46) :错误 A2003:不正确的行语法:。.else D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(48):错误 A2003:不正确的行语法:。.endif D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(53) :错误 A2173:表达式中的语法错误 sub x5, x5, x4 // samples2 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(53) : 错误 A2003: 不正确的行语法: 无法解析操作数 sub x5, x5, x4 // samples2 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(54) : error A2173: syntax error in expression neg x13, x4 // -incr D:\Work\ Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(54) : 错误 A2003: 不正确的行语法: 无法解析操作数 neg x13, x4 // -incr D:\Work\Chromium_FFmpeg\chromium\src\ third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(56):错误 A2003:不正确的行语法:。.ifc \type,固定 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(57) : error A2173: syntax error in expression ld1r {v16.2s}, [x2] // dither_state D:\Work\Chromium_FFmpeg \chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(57) : 错误 A2003: 不正确的行语法: 无法解析操作数 ld1r {v16.2s}, [x2] // dither_state D:\Work\Chromium_FFmpeg\ chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(60) : 错误 A2061: 非法表达式类型;预期绝对数字 movi v30.2d, #(1<error A2034: unknown opcode: MLA2 MLA2 v17, v2, v0 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(93) : 错误 A2034: 未知操作码: MLS2 MLS2 v19、v3、v6 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(95):错误 A2034:未知操作码:MLS2 MLS2 v17、v4、v7 D:\Work \Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(97):错误 A2034:未知操作码:MLS2 MLS2 v19、v5、v1 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\ libavcodec\aarch64\mpegaudiodsp_neon.S(98):错误 A2034:未知操作码:。b.gt 2b D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(101) : 错误 A2173: 表达式 sub x10, x10, #64<<5 // 64 中的语法错误* 8 * sizeof(int32_t) D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon。S(101) : 错误 A2003: 不正确的行语法: 无法解析操作数 sub x10, x10, #64<<5 // 64 * 8 * sizeof(int32_t) D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\ libavcodec\aarch64\mpegaudiodsp_neon.S(103):错误 A2003:不正确的行语法:。.ifc \type,已修复 D:\Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(105):错误 A2034:未知操作码:ext ext v28.16b、v29.16b、v28。 16b,#8。. . \Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(105) : 错误 A2034: unknown opcode: ext ext v28.16b, v29.16b, v28.16b, #8 。. . \Work\Chromium_FFmpeg\chromium\src\third_party\ffmpeg\libavcodec\aarch64\mpegaudiodsp_neon.S(105) : 错误 A2034: unknown opcode: ext ext v28.16b, v29.16b, v28.16b, #8 。. .
gcc - 由 gcc 生成的 assemblercode 在由 ARM-assembler 汇编时导致致命错误
我发现 ARM 编译器armcc V5.05
没有uint64_t
正确编译成汇编代码。它只使用一个寄存器而不是两个,因此结果被截断为 32 位(尽管编译器没有抱怨)。作为一种解决方法,我使用了 gcc 编译器,将生成的汇编代码放入单独的 asm 文件并运行 ARM 汇编。由于以下错误,无法创建目标:
此寄存器组合导致不可预测的行为
我想这真的很致命。在函数末尾的 C-“return”语句之后,gcc 在 ASM-return 命令之前插入了一个违规SUB SP,R11,#0
或ADD SP,R11,#0
命令BX LR
。无论有没有uint64_t
. 我可以依赖 gcc 还是 armcc/armasm 中的错误?