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

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

7a2a58f50ebfb4f629482e909985172e.png

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

2cfa19e3386ae7200f292195dff8cd06.png

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

2f583b38b171a509b68990c79cd24e1a.png

# imm32表示立即数

I2 = imm32 & (0x01 << 22)

I1 = imm32 & (0x01 << 23)

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

d3d551f987def1fb4547c6bfdbe8fad1.png

# 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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值