assembly - ARM 汇编中的 "Change instruction set"- 这究竟是什么意思?

标签 assembly arm cortex-m3

BX更改指令集说我们这里有手册,据我远近搜索发现,这意味着虽然CPU运行16位Thumb指令集,但这次它接受了32位地址(我发现没有迹象表明以下命令会发生任何变化)以便您可以进一步分支到一个点,我理解对吗?如果是,仅此而已吗?
据说我们使用的是 Atmel AT91,大概是 Cortex M3 类型,但是我能接触到的关于 Cortex M3 的任何东西似乎都与我们所做的明显不同,虽然我在 Keil uVision 中找不到 AT91,但他们也是我们使用的方式由其中一位教授开发的平台,所以我怀疑这并不是我们正在做的真正的事情,但我仍然想知道这是什么东西,因为我正在考虑总体上研究 assembly ......

最佳答案

您提到的处理器(Cortex M3)不支持 ARM 指令,因此您无法使用 BX。您只能使用基本的 Thumb 指令。

话虽如此,值得为您提供一些背景知识:

BX 指令执行分支(即跳转)并根据分支地址的第 0 位将处理器切换到 ARM 或 Thumb 模式。这样做的目的不是让您跳得更远,而只是在模式之间切换。由于所有支持此指令的处理器都以 ARM 模式启动,因此切换到 Thumb 模式不会增加您的跳转距离。

关于 Thumb 与 ARM 模式的详细信息很微妙,这里不一一列举,但可以找到一个很好的资源 here .由于单独的链接可能会失效,这里是一个摘要:

  • 在 Thumb 模式下,“与程序相关的分支,尤其是条件分支,在范围上比在 ARM 代码中更受限制,并且子程序的分支只能是无条件的”。
  • ARM 模式可以访问更多的通用寄存器,而 Thumb 模式只能有限地访问 r8-r15。
  • 关于assembly - ARM 汇编中的 "Change instruction set"- 这究竟是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24460083/

    相关文章:

    assembly - 如何在气体汇编代码中导出类型为 "FUNC"和 "GLOBAL"的符号?

    assembly - 为什么编译器不使用 ENTER 和 LEAVE 指令?

    android - 在 Android.mk 中为程序集 (.s) 源文件定义一个符号?

    gcc - 使用 GCC 编译器为代码的特定部分保留寄存器

    x86_64 和/或 armv7-m mov 指令可以在运行中中断吗?

    c - 从 NTP 服务器(Cortex M3、Stellaris LM3S6965)获取时间

    c - 混合 c 和组装。在终端上没有打印任何内容

    c++ - 预期 `__asm` 语句中的表达式

    .net - 如何使我的 .net、WPF、WinForms 等应用程序在 ARM 驱动的 Windows 8 系统上运行?

    内存映射的 gcc 链接文件,那是什么语法?