在ARM手册中BL指令如下描述(其后跟立即数的描述如下,跟寄存器直接看手册很简单):

其中比较难理解的就是J1,J2的获取,在手册中有描述,请看如下所示:

I1,I2就是立即数的bit[23:22]两个bit位。

# imm32表示立即数

I2 = imm32 & (0x01 << 22)

I1 = imm32 & (0x01 << 23)

S:表示符号最高为topbit(x)

# offset 带符号的立即数

S = (0x01 << 26) if offset < 0 else 0

则J1,J2的可以按如下计算

J1, J2 = (1 if I1 else 0, 1 if I2 else 0) if S else (0 if I1 else 1, 0 if I2 else 1)

J2 <<= 11

J1 <<= 13

1. 算法1

def signExtend(address, entry):

offset = entry - address - 4

imm32 = offset & 0x7fffffff

# contains the sign bit

S = (0x01 << 26) if offset < 0 else 0

imm11 = (imm32 & 0x00000FFE) >> 1 # [11: 1]

imm10 = (imm32 & 0x003FF000) >> 12 << 16 # [21: 12]

I2 = imm32 & (0x01 << 22)

I1 = imm32 & (0x01 << 23)

J1, J2 = (1 if I1 else 0, 1 if I2 else 0) if S else (0 if I1 else 1, 0 if I2 else 1)

J2 <<= 11

J1 <<= 13

code = 0xF0000000 # [31: 27], BL

instr = code | S | imm10 | 0x0000C000 | J1 | 0x00001000 | J2 | imm11

imm32 = ((instr & 0xffff) << 16) | ((instr >> 16) & 0xffff)

return imm32

2. 算法2

def signExtend2(address, entry):

imm32 = (entry - address - 4) // 2

low = 0xF800 | (imm32 & 0x7FF)

high = 0xF000 | (0x03 << 9) | ((imm32 >> 11) & 0x1FF)

return ((low << 16) | high)

3. 算法3

def signExtend3(address, entry):

offset = ( entry - address - 4 ) & 0x007fffff

high = 0xF000 | offset >> 12

low = 0xF800 | (offset & 0x00000fff) >> 1

imm32 = (low << 16) | high

return imm32

测试示例:

data = signExtend(0x20001580, 0x20000074)

data2 = signExtend2(0x20001580, 0x20000074)

data3 = signExtend3(0x20001580, 0x20000074)

print('0x{:08X}'.format(data))

print('0x{:08X}'.format(data2))

print('0x{:08X}'.format(data3))

输出:

0xFD78F7FE

0xFD78F7FE

0xFD78F7FE

# instr = 0xFD78F7FE

# print(bin(instr))

# 11110 1 1111111110 11 1 1 1 10101111000

# S imm10 J1 J2 imm11

ARM指令计算机器码,ARM中几种把BL指令转化为机器码算法相关推荐

  1. 【机器学习】干货!机器学习中 5 种必知必会的回归算法!

    提到回归算法,我想很多人都会想起线性回归,因为它通俗易懂且非常简单.但是,线性回归由于其基本功能和有限的移动自由度,通常不适用于现实世界的数据. 实际上,它只是经常用作评估和研究新方法时进行比较的基准 ...

  2. B,BL指令的使用范围

    在嵌入式汇编程序中,B和BL指令是很常见的,这两个的区别很简单,就是BL指令带返回,即在跳转到某个程序时,会自动的保存返回地址,所以一般在子程序的最后一条命令是mov pc,lr. B和BL指令好用, ...

  3. ARM中MRS和MSR汇编指令

    ARM中有两条指令用于在状态寄存器和通用寄存器之间传送数据. 针对32位的ARM处理器,状态寄存器就是一个32位长的寄存器.每个位的含义如下图: 分成了4部分: 1,条件标志位 N(Negative) ...

  4. Arm v9 “机密计算架构(CCA)” 中机密领域管理扩展技术(RME)是什么?

    机密领域管理扩展技术(RME)是什么? 1 Overview 2 Security states 2.1 Controlling the current Security state 2.2 Movi ...

  5. ARM编程中B指令与BL指令的区别

    ARM汇编程序中B指令和BL指令都是会跳转到某个标号处运行,类似于C语言中的goto 命令,例如利用B指令实现一个循环(每次对r0 寄存器中的值加1): .textmov r0, #1 //将r0寄存 ...

  6. ARM中LDR B BX BL BLX指令的研究

    原来的文章有点乱,所以稍微整理了一下有用的要点: (1)  LDR作为伪指令的格式:LDR 寄存器, = 数字常量/Label 如:LDR   R2,=0x55aa ; 表示将0x55aa送入寄存器R ...

  7. arm B和BL指令浅析

    B或BL指令引起处理器转移到"子程序名"处开始执行.两者的不同之处在于BL指令在转移到子 程序执行之前,将其下一条指令的地址拷贝到R14(LR,链接寄存器).由于BL指令保存了下条 ...

  8. ARM官方汇编与ARM GNU汇编中的伪操作

    以下内容源于网络资源的学习与整理,如有侵权请告知删除. 参考博客 (1)嵌入式Linux ARM汇编 (2)GNU ARM 汇编基础 - wanli1024 - 博客园 (3)GNU ARM 汇编简介 ...

  9. 【ARM学习笔记】ARM汇编指令:B、BL、BX、BLX的区别

    文章目录 1 ARM的跳转指令介绍 2 ARM的4个跳转指令 2.1 B 指令 2.2 BL 指令 2.3 BLX 指令 2.4 BX 指令 3 更多分享 1 ARM的跳转指令介绍 跳转指令用于实现程 ...

  10. 代码 or 指令,浅析ARM架构下的函数的调用过程

    摘要:linux程序运行的状态以及如何推导调用栈. 1.背景知识 1.ARM64寄存器介绍: 2.STP指令详解(ARMV8手册): 我们先看一下指令格式(64bit),以及指令对于寄存机执行结果的影 ...

最新文章

  1. 大有可为的“正则表达式”(二)
  2. Vmware的 管理工具概述
  3. 我所理解的原型原型链 1
  4. 68.视图在数据库系统三级结构的哪一级上?
  5. 初探运算符重载------(减号)
  6. 世界地板大会姚红鹏的三问
  7. 组织与科目等维度构建
  8. Makedown 本地图片问题
  9. 不规则对话框的又一实现
  10. Android 内核的开发“顽疾”如何解决?
  11. oracle认证071和061,【2019年8月版本】Oracle OCP认证 071考试原题-32
  12. 黑苹果intel网卡驱动方法
  13. 二阶系统响应指标图_频率响应介绍_二阶系统的频率响应
  14. 汽车电子测试相关名词解释
  15. 微信加好友,提示操作过于频繁 ,有什么办法解决
  16. python中的大数据品牌运营专业公司_大数据专业有哪些就业岗位?
  17. Ubuntu rhythombox 乱码解决
  18. Linux系统学习方法论
  19. linux vi 看下一页,linux中的vi命令(2)
  20. 第五讲 Matlab/Simulink入门——混合系统仿真实例

热门文章

  1. 简单async数据分批处理
  2. Python学习心得--变量类型篇
  3. [预打印]使用vbs给PPT(包括公式)去背景
  4. (转)如何入门 Python 爬虫
  5. redhat7 防火墙设置
  6. [android视频教程] 传智播客android开发视频教程
  7. C# 线程同步 信号量 Semaphore
  8. redis连接过多导致 redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool
  9. javascript框架echarts插件实现超酷人立方效果图
  10. 多线程之操作CopyOnWriteArrayList解决Iterator迭代器产生java.util.ConcurrentModificationException