arm-thumb指令集的blx指令如何支持4MB范围

2024-04-26

读自https://www.keil.com/support/man/docs/armasm/armasm_dom1361289866046.htm https://www.keil.com/support/man/docs/armasm/armasm_dom1361289866046.htm手臂拇指指令blx指令可支持最大4MB的跳转范围。

但据我所知,arm-thumb指令只有16位长,那么16位怎么能包含4MB的偏移量呢?


在原始的 Thumb 指令集中,BL指令由两条 16 位指令组成,编码如下:

1111 HOOO OOOO OOOO   BL <label>
     |            |
     |            \.. long branch and link offset high/low
     \............... low/high offset
                        0 -- offset high
                        1 -- offset low

两条指令中的第一条必须将 H 位设置为 0。11 位偏移量左移 12,添加到PC并放入LR登记。

LR = PC + (offset << 12)

两条指令中的第二条指令必须将 H 位设置为 1。 11 位偏移量左移 1,添加到LR注册,并用作分支目标。这LR寄存器设置为返回地址。

temp = next instruction address
PC = LR + (offset << 1)
LR = temp | 1

对于 ARMv5T,Thumb 编码BLX添加了指令,允许 Thumb 代码调用 ARM 代码。这是通过在后半部分*定义一个新的拇指位来完成的。BL操作说明。

111T 1OOO OOOO OOOO   BL/BLX <label> (second half)
   |              |
   |              \.. long branch link exchange offset low
   \................. thumb bit
                        0 -- BLX is encoded
                        1 -- BL  is encoded

的运作BLX与后半部分类似BL指令,但偏移量必须是偶数。该函数在 ARM 状态而不是 Thumb 状态下调用。

temp = next instruction address
PC = (LR + (offset << 1)) & 0xfffffffc
LR = temp | 1
CSPR T bit = 0

请注意,总共 22 个立即位给出半字偏移量,可实现观察到的 ±4 MiB 的分支偏移量。

将两半放在一起,我们还可以看到BL and BLX作为 32 位指令,编码如下:

1111 0OOO OOOO OOOO  111T 1OOO OOOO OOOO   BL/BLX <label>
                  |     |              |
                  |     |              \.. 22 bit offset (low half)
                  |     \................. thumb bit
                  \....................... 22 bit offset (high half)

In Thumb2, this scheme was extended. BL and BLX became proper 32 bit instructions and their halves must be given consecutively. Some bits of the second instruction word were defined to extend the branch offset to ±16 MiB.

1111 0SOO OOOO OOOO  11AT BOOO OOOO OOOO   BL/BLX <label>
      |           |    || |            |
      |           |    || |            \.. 21 bit offset (low half)
      |           |    || \............... additional bit J2
      |           |    |\................. thumb bit
      |           |    \.................. additional bit J1
      |           \....................... 21 bit offset (high half)
      \................................... sign bit

如果设置了拇指位,则BL指令被编码。如果清楚的话,则BLX指令被编码。在后一种情况下,21 位偏移必须是偶数。然后分支偏移计算如下:

I1 = !(J1 ^ S)
I2 = !(J2 ^ S)
imm32 = (S ? 0xffff << 24 : 0) | (I1 << 23) | (I2 << 22) | (imm21 << 1)
temp = next instruction address
PC = LR + offset
LR = temp | 1
if thumb bit clear
    CSPR T bit = 0 

虽然对附加偏移位进行编码的方案一开始看起来很复杂,但这只是将两个附加位编码到分支偏移中同时与分支偏移的现有编码兼容的最简单方法。BL and BLX指示。


See the ARM 架构参考手册,ARMv7-A 和 ARMv7-R 版, the ARM7TDMI 数据表,以及ARM架构参考手册ARMv5 供进一步阅读。

* 相关编码1110 0OOO OOOO OOOO编码16位无条件分支指令B <label>.

† 在 Thumb2 之前,a 的两部分BL or BLX这些指令是独立的指令,可以与其他指令穿插发出,甚至可以单独发出,但强烈建议按连续顺序发出。中断也可能发生在一个的两半之间BL or BLX指令,使临时内容LR注册可观察的。在包括 ARMv6-M 在内的 Thumb2 目标上,这不再可能,并且BL and BLX表现为 32 位指令。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

arm-thumb指令集的blx指令如何支持4MB范围 的相关文章

随机推荐

  • 为量角器安装特定的 chromedriver

    我在 CircleCi 上运行的 chrome 驱动程序遇到问题 问题是运行时 node modules bin webdriver manager update 然后使用以下命令检查 chromedriver 和 selenium 的版本
  • html中的有什么用?

    看起来它允许您编辑元素的内容 但实际上发生了什么 这个属性有什么用呢 编辑 参见here http www w3 org TR html5 editing html contenteditable 这通常用于富文本输入 虽然常规表单元素如
  • Python 代码中标识符错误中的无效字符

    对于以下代码 我收到 标识符中的无效字符 错误 显示错误时 第 3 行中的 http 会突出显示 我是Python新手 请帮忙 import requests import html r requests get http cricapi
  • “找不到符号:方法”但该方法已声明

    在我的驱动程序中 这一行给了我cannot find symbol错误 我不知道为什么 该方法在SavingsAccount类 我可以引用我的驱动程序中的所有其他方法 但不是那个方法 我尝试将类型更改为double等但仍然无法正常工作 Ac
  • 是否可以在 C# 中观察 Rss feed 变化?

    我想创建一个服务来监听一些 Rss 提要并将新提要解析为 json 以供进一步使用 是否可以观察饲料的变化 如果可以 那么如何观察 thanks 查看System ServiceModel Syndicate SynminationFeed
  • 检查 Laravel 控制器中的多个守卫

    我在 laravel 中创建了三种类型的守卫 我可以检查身份验证用户 但我们有一些对所有用户都相同的路由和控制器 我需要为每种类型的登录用户检查相同路由或控制器中的所有守卫 我的 auth php 文件看起来像这样
  • 如何在ios中以编程方式安排事件?

    我的任务是编写一个应用程序 允许用户安排将来发送的电子邮件 用户从日期选择器中选择日期时间 撰写消息和收件人 然后安排事件 当日期 时间出现时 消息就会被发送出去 有人可以指导我如何安排日程安排吗 比如说短信 我知道如何发送短信 只是不确定
  • AWS lambda 基本身份验证,无需自定义授权者

    我在为用 Node js 编写的 AWS lambda 函数设置基本身份验证时遇到问题 问题 AWS lambda 函数是附加服务的代理 该函数仅转发整个请求并向用户提供整个响应 这就是为什么我需要强制使用Authentication标题
  • 理解同构字符串算法

    我理解以下代码来查找字符串是否同构 该代码使用两个哈希值s dict and t dict分别 我假设字符串的长度相同 def isIsomorphic s t s dict t dict for i in range len s if s
  • Flutter 中使用 BLoC 的异步请求

    我想下载数据 但也一直使用该应用程序 你能告诉我这是否是正确的解决方案 情况是我们按下下载按钮并调用函数 bloc dispatch Event download 在 Download 事件的 mapEventToState 中 我们请求数
  • Python 列表顺序

    在我编写的小脚本中 append 函数将输入的项目添加到列表的开头 而不是该列表的末尾 正如你可以清楚地理解的那样 我对 Python 很陌生 所以对我宽容一些 list append x 将项目添加到列表末尾 相当于a len a x 这
  • 如何捕获按下 HTML5 视频元素的默认全屏按钮时的全屏事件?

    我在使用 HTML5 时遇到问题video标签和iconic 这是我的模板的一部分
  • 将 .aar 和 .jar 文件嵌入库中

    我将创建一个包装许多蓝牙设备 SDK jar 和 aar 文件 的 android 库 aar 此文件无法在 Maven 或替代存储库中发布 点击这些链接 link1 https stackoverflow com a 60888941 5
  • 使用 PHP 将未知行数插入 MySQL

    我正在尝试使用 PHP 将未知数量的行插入到 MySQL 中 它应该是这样工作的 Javascript 解析 HTML DOM 以创建基于 css 类的多维数组 该数组将具有一定数量的行 或子数组 与具有该类的元素数量相对应 这可以是任何
  • 使用代码将 Google Apps 脚本函数分配给 Google 表格图像

    使用代码将 GOOGLE APPS 脚本功能分配给图像 通过单击 Google 表格中的图像并选择 分配脚本 选项 就可以实现这一点 但这是一项手动任务 我想将其自动化 可以将图像插入 Google 表格并使用 Apps 脚本代码分配函数
  • 如何在 Vaadin 7 表中实现滚动监听器

    在 Vaadin 中 当您在表格中向下或向上滚动时 com vaadin ui Table 不会触发任何事件来告诉您用户正在滚动 为什么我们需要在表格中滚动事件 我们先来看看 Vaadin 这个例子 仪表板演示 http demo vaad
  • 扩展会员提供者

    设想 构建一个供公司输入信息的应用程序 我需要扩展 ASP NET 中的内置成员资格提供程序 我的独特情况是 我已经拥有每家公司的人口统计信息 但没有网络应用程序的用户 ID 和密码 我想用人口统计信息预先填充数据库 向每个公司发送一个唯一
  • 使用另一个表中的唯一值创建一个表

    我正在使用 MS SQL Server Management Studio 我有桌子 Num ID Alpha ID 1 A 1 B 1 C 2 B 2 C 3 A 4 C 5 A 5 B 我想创建另一个包含该表中 2 列的表 以便 col
  • Angular 6 HttpClient - CORS 问题

    我的 Nodejs Restful 服务有以下端点http localhost 3000 api countries http localhost 3000 api countries 我正在使用这个中间件https github com
  • arm-thumb指令集的blx指令如何支持4MB范围

    读自https www keil com support man docs armasm armasm dom1361289866046 htm https www keil com support man docs armasm arma