问题标签 [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.

0 投票
1 回答
8682 浏览

assembly - 错误:A1163E 未知操作码 R0,期望操作码或宏指令在左列

今天我的代码中出现了这个错误:

RTE\Device\STM32F407VGTx\startup_stm32f407xx.s(191):A1163E:未知操作码 R0,需要操作码或宏

这是它停止的代码区域:

错误

我没有在我编写的代码中执行任何组装,这似乎是出现此消息的常见原因。有人能帮我解决这个问题吗?这是我第一次使用 STM32F4 板进行编程,所以我不完全确定从哪里开始寻找 :(

0 投票
1 回答
4070 浏览

assembly - 如何使用 Clang 以 ARM 语法编译 ARM 程序集?

似乎默认情况下 Clang 假定使用 GNU 汇编器语法。

如何使用 Clang 编译使用 ARM 语法作为this(指令)this(指令)的程序集文件?

0 投票
1 回答
89 浏览

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

有没有人可以解释一下?

谢谢!

0 投票
0 回答
271 浏览

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 毫秒

0 投票
1 回答
805 浏览

sorting - “访问未对齐的内存位置,地址错误=ffffff”

我正在尝试从 input.txt 文件中读取整数,下面是我的读取循环,我正在尝试读取整数并将其存储到数组中。我在使用 ARM SIM 的“LDR R2,[R2,R5,LSL #2]...im做错了吗?

0 投票
1 回答
265 浏览

c++ - SEGFAULT 写入堆栈变量

我在 ARM linux 平台上遇到了一个由简单代码引起的非常奇怪的崩溃。问题是它很少重现(每天一次),另一个问题是它在实际上不能崩溃的地方崩溃。

让我们从 C++ 代码开始。线程函数这样做:

engine是指向目前只有一个实现的基本抽象类的指针。getEvents 是纯虚方法。

getEvents经过一些更改后,除了这个什么都不做

尝试在 num 中存储 0 时发生 SEGFAULT。首先我认为这是堆栈损坏,但在我检查生成的汇编代码之后,似乎没有任何东西存储在堆栈中。这种方法甚至没有生成堆栈保护(启用-fstack-protector-strong),两个参数都存储在寄存器r1和r2中。让我们看一下函数调用的代码:

以及函数本身的代码:

从生成的代码中可以看出,指针被放入 intr1r2寄存器。

即使堆栈损坏,它也可能损坏num变量的值,但是它如何损坏寄存器中的指针呢?同样从崩溃日志中我可以看到LR地址是错误的。

CRASH 信号 11 分段故障地址 0xf0000000 PC 0x251fe LR 0x6c3c533c

从这里我唯一看不到的是跳转的地址(blx r3),因为调用的方法是虚拟的。我有一个非常不可能的假设,即不是跳转到虚拟方法主体的第一行,而是在此之前跳转到几行并损坏了寄存器,但我不明白这怎么可能。即使在更改代码之后,它也总是在同一行崩溃。这很奇怪。

有人可以建议尝试一下吗?有任何想法吗?

提前致谢。

0 投票
0 回答
84 浏览

arrays - Arm Asm 双寄存器立即数

我有一个任务需要用 armasm 编写的 Ln 算法。我决定使用 BKM 算法。该算法使用查找表。该作业还需要在 asm 中实现查找表。问题是我在编译时遇到了 immediateOutOfBounds 错误或garbageFollowingInstruction 错误,即使是像VMOV.f64 d2, #0.0这样的立即数。在我的其他 asm-Functions 这些操作工作正常

这是代码:

提前致谢

0 投票
1 回答
346 浏览

arm - 如何在 gnu 汇编程序中使用 TBB 指令(Cortex-M3)?

Arm通用用户指南(第 172 页)的第 3.10.4 节给出了使用 TBB 的示例,但该示例使用 Arm 汇编程序。我想学习如何将 TBB 与气体一起使用,但似乎无法弄清楚如何。我应该如何修改指南中的示例以使用 gas 而不是 armasm 实现 switch 语句?

我是使用 gas 的新手,我不确定是否应该在汇编文件开头的 .data 部分中定义分支表,或者是否应该在 .text 部分中的 switch 语句之后。

0 投票
1 回答
310 浏览

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 。. .

0 投票
0 回答
42 浏览

gcc - 由 gcc 生成的 assemblercode 在由 ARM-assembler 汇编时导致致命错误

我发现 ARM 编译器armcc V5.05没有uint64_t正确编译成汇编代码。它只使用一个寄存器而不是两个,因此结果被截断为 32 位(尽管编译器没有抱怨)。作为一种解决方法,我使用了 gcc 编译器,将生成的汇编代码放入单独的 asm 文件并运行 ARM 汇编。由于以下错误,无法创建目标:

此寄存器组合导致不可预测的行为

我想这真的很致命。在函数末尾的 C-“return”语句之后,gcc 在 ASM-return 命令之前插入了一个违​​规SUB SP,R11,#0ADD SP,R11,#0命令BX LR。无论有没有uint64_t. 我可以依赖 gcc 还是 armcc/armasm 中的错误?