问题标签 [thumb]

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 回答
357 浏览

arm - 来自不同制造商的 Thumb-2 ARM-Core Micros 是否具有相同的代码大小?

比较来自两个不同制造商的两个 Thumb-2 micros。一个是 Cortex M3,一个是 A5。他们是否保证将特定的代码段编译为相同的代码大小?

0 投票
2 回答
2015 浏览

assembly - 手臂拇指模式 4byte 指令

Thumb 模式指令为 2 个字节,ARM 模式指令为 4 个字节。截图是拇指模式指令的反汇编。为什么我看到 4 字节指令与 2 字节指令混合在一起?有人可以解释一下吗?

先感谢您。

在此处输入图像描述

0 投票
3 回答
2111 浏览

assembly - 汇编中的 ARM/Thumb 互通

我正在构建一个 Windows Phone 项目,其中有一些在汇编中。我的程序集文件处于 ARM 模式 ( CODE32),它会尝试跳转到我知道已编译为 Thumb 的 C 函数。代码如下:

这是奇怪的事情。片段中的值pFunc是指向函数 thunk 的指针加一。也就是说,第 0 位被设置,好像跳转目标是 Thumb,跳转指令是 BX。但重击显然是 ARM!thunk 加载函数体的地址加一并对其执行 BX,正确切换模式。

尝试 BX 到该地址可能会崩溃,因为这会切换模式并尝试在 Thumb 模式下执行 ARM 代码不是一个好主意。尝试简单地跳转到该地址(如当前代码所做的那样)也可能会崩溃,因为 PC 最终会未对齐。

理论上,我可以手动清理第 0 位然后跳转,但我的想法肯定有一些错误。thunk 是由 C 编译器生成的 - 对吧?C 编译器知道 thunk 是 ARM 代码。pFunc 下的地址是由链接器生成的,因为它是一个跨模块调用。所以低位被链接器放在那里;为什么链接器不知道这些 thunk 是 ARM?

请问有什么解释吗?

我现在没有 WP8 设备,所以无法在真实硬件中试用。盯着生成的代码是我唯一的调试技术:(

编辑:但是如果这些 thunk 不是 ARM,而是 Thumb-2 怎么办?Thumb-2 支持一些 32 位命令 IIRC。它们的编码是否与 ARM 模式相同?无论如何,Thumb-2 如何解码命令?

0 投票
3 回答
677 浏览

assembly - WinPhone8 是否完全支持 ARM(不是 Thumb)?

我面临一个奇怪的问题,有点类似于this。我有一个 Windows Phone 8 本机 DLL 项目,主要是 C++,但其中包含 ARM 程序集源。源处于 ARM 模式(即不是 Thumb)。C++ 编译为 Thumb。

当 C++ 尝试调用汇编例程时,应用程序崩溃。反汇编中的调用命令是带有立即偏移量的 BLX - 它应该无条件地将模式切换回 ARM,但不知何故它没有。

我有异常的详细信息。异常代码为0xc000001d(无效操作),crash context struct中PC的值为0x696d5985。这在任何一种模式下都是不可能的——它没有对齐,零位是一。BLX 指令运行1b f0 0c eb- 如果您破译,那是一个由两部分组成的 Thumb 式 BLX 好吧,具有 4 对齐位移。崩溃上下文中的 T 标志为 SET (CPSR=0x60000010)。

我没有设备,但来自 beta 测试人员的崩溃日志非常有说服力。在调用程序集之前我有一个调试日志记录。然后是崩溃。

编辑:相关。然而,他们声称汇编程序本身 ( armasm) 将 ARM 转换为 Thumb。对我来说不是这样——至少不是静态的。DLL 包含正确的 ARM 代码,如汇编源代码 ( CODE32) 中所指定。

编辑:尝试使用稍微不同的跳转顺序:

结果相同。看起来商店中某处发生了一些奇怪的代码变形,或者操作系统本身捕获了模式切换并阻止了它们。

代码变形可以通过将可执行文件的一部分连同其余的崩溃数据一起转储到崩溃日志中来检测。但是,除了将整个代码库转换为 Thumb 之外,我还能如何处理操作系统干扰?它不只是重新编译。

为 dwelch 编辑:编译的 C 代码中的调用序列如下所示:

BLX 到立即地址有切换模式。这不是有条件的,例如bx register. 调用目标是一个 thunk:

崩溃地址是这个 thunk 加一:5985。

这是已编译 DLL 的反汇编,但我不能保证这正是设备上正在执行的内容。链接的 MSDN 线程中的用户声称他们查看了调试器中的反汇编并看到了 ARM 应该在的地方。微软, IIRC,拥有修改从发布者到设备的应用程序代码的专利;这可能是原因。

0 投票
1 回答
2013 浏览

build - 为 STM32F4-Discovery 编译和构建 avconv/ffmpeg 的 Slim 版本 - armv7 thumb 1/2 架构

这是我第一次尝试在 Stack Overflow 上发帖寻求帮助。

我的项目:使用带有 STM32F407VGT6 芯片的 STM32F4-Discovery 和 FPv4-SP 和相机/LCD 外围设置,我需要以 QVGA 录制视频并输出为压缩比至少为 25:1 的 MPEG-4 格式。

我已经确定了所需的编解码器库(avconv,除非 ffmpeg 证明更有用),现在我正在尝试构建编译器选项,为我提供一个能够在 ANSI-C 芯片上执行的轻量级版本和拇指架构。

该板的空间非常有限(192KB SRAM 和 1MB 闪存 - 有扩展的可能性,但最好只使用我所拥有的),目前任一库的“主要”可执行文件都超过 1MB。

从我尝试过的不同解决方案的输出来看 - 似乎很多编译器选项都没有成功应用于构建。所以我的问题是:

1) 是否可以仅使用 rawvideo 解码器、mpeg4 编码器和最基本的实用程序将任一库编译到所需的空间?如果没有,有没有估计需要多少?

2)我花了很多时间在互联网上搜索,但似乎没有人尝试过 - 有没有人可以告诉我其他情况?

我手头有我的配置/构建脚本,任何人都想看看我是否错过了一些基本的东西。只要问,我会通过电子邮件发送它,我不想让线程变得比我看似冗长的调查已经拥有的更多。

我认为这两个库都不太可能损坏。我一直在 Ubuntu 12.04 32 位上尝试这个。

我是一名软件实习生,非常感谢任何可用的帮助。

最后一个问题,如果我的解决方案被证明不可行,是否有另一个开源 mpeg4 压缩库可以为嵌入式 ARMv7E-M/Thumb 集架构轻松编译?

编辑:这是以前未包含的构建命令。

这是我获得并修改的脚本。它最初是为 ARMv7-a 成功构建的,它不会在 ARMv7e-m 芯片(发现板)上执行。

0 投票
3 回答
3883 浏览

assembly - ARM Cortex M0/M3/M4:为什么PC在Thumb状态下总是偶数

据我了解,ARM Cortex-M CPU 始终处于 Thumb 状态,这意味着:

程序计数器为奇数 (LSB = 1) 指示的拇指状态。跳转到偶数地址会导致异常,因为不允许切换回 ARM 状态。

但是,当我使用 CortexM0 和 M4 CPU 时,PC 总是均匀的。每次我分支,LR记录PC+1,每次我返回,PC给LR-1。

例如,如果 lr = 0x0000_01D5,

执行

BX lr

那么 PC 应该是 0x0000_01D5,而它给出的是 0x0000_01D4。

这不是不可能吗?

任何评论将不胜感激。

0 投票
2 回答
3114 浏览

arm - 反转寄存器 Thumb-2 中的位

所以我的问题是一个我虽然相当简单并且我有一个算法,但我似乎无法使用 thumb-2 指令使其工作。

安利,我需要将r0的位反转,我认为最简单的方法是将数字逻辑右移到临时寄存器中,然后将左移到结果寄存器中。但是 LSL、LSR 似乎不允许您存储丢失到最高有效位或最低有效位的移位位(同时也移位该寄存器的位)。有没有我想念的指令的某些部分。

这是我的 ARM 参考: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/ Cjacbgca.html

0 投票
1 回答
838 浏览

arm - ARM 到 Thumb2 互通

我有自己的 ARM asm(32 位 ARM/NEON)。从这个 asm 代码中,我调用了一些用 C 实现的函数。像这样:

1) 如果 ARM-asm 知道 ConvolveC4 是 Thumb2,它需要做什么才能调用它并切换到 Thumb2?

2) 如果 ARM-asm 不知道 ConvolveC4 是什么,那么显然 ARM asm 会保持原样,但我需要在 ConvolveC4 端添加某种单板以确保 ARM 状态正确切换。

0 投票
2 回答
9322 浏览

assembly - 指令大小是什么意思?

我真的很困惑,这个问题听起来可能很愚蠢,但我真的不确定当我们说指令大小是 32 位或 16 位时这意味着什么。

如果操作数大小是 32 位,那么我们说它是 32 位指令,如果操作数大小是 16 位指令。

或者每条指令都有操作码,如果操作码地址是 32 位,那么我们说指令是 32 位的。

我也在经历 ARM 架构,我读到的所有拇指指令都是 16 位的,但 ARM 模式指令是 32 位的。

指令大小完全取决于使用的架构还是取决于 CPU 运行的模式?

编辑:

http://www.xgc-tek.com/manuals/m1750-ada/m1750/x524.html

给定的链接表明16位指令由8位操作码和两个通用寄存器的4+4位组成。

ARM thumb 指令集是怎么回事?

0 投票
1 回答
806 浏览

assembly - 明确解码 ARM 指令

目前我试图研究指令空间或ARMv7处理器的重新分区,参见。在此处找到的文档。目前有一个细节让我感到困惑,那就是处理器如何消除一些指令对之间的歧义。

例如,让我们考虑以下两个 THUMB 指令:

  • A8.8.18 B:编码 T3

    /li>
  • A8.8.32 CLREX:编码 T1

    /li>

需要注意的两件事是,两条指令的所有固定位都相等,其次,第二条指令的 cond = 1110,这是一个有效的条件代码 (AL)。根据指令语义,S 是符号位,J2:J1:imm6:imm11 是相对跳转目标,所以它们可以有任何值。

这个解码看起来模棱两可,但我肯定是错的。我在这里想念什么?对此的任何说明将不胜感激。