ARM汇编语言编码

本文介绍了ARM汇编语言中关于立即数的处理,特别是当立即数在0—0xFF范围内的编码方式。此外,讨论了24位跳转指令的范围及其左移后的效果,使得跳转范围扩大到32M。还提到了BX和BLX指令的编码差异,并指出跳转指令使用PC寄存器作为基址,通过计算目标地址与PC的差值作为偏移量来实现相对跳转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)数据处理指令的编码格式

cond:   指令的条件码
I:           用于区别operand2是立即数(I=1)还是寄存器(I=0)
opcode:指令操作码
S:          操作是否影响cpsr,S=0不影响,S=1影响
Rn:        包含第一个操作数的寄存器编码
Rd:        目标寄存器编码
operand2:第二操作数,有三种方式:立即数方式,寄存器方式,寄存器移位方式。每种方式下的编码格式不一样    
    
立即数方式:

如图所示,在ARM的指令系统中,每个32位的立即数被编码成一个12位的数。这个32位的数是由一个8位的常数循环右移偶数位得到。其中循环右移的位数由一个4位二进制数的两倍表示,如图,8位常数加4位循环右移位数构成了一个12位数。

设立即数为immediate,8位常数便为immed8,4位的循环右移值为rotate,则:
immediate = immed8 循环右移 rotate*2
所以并不是每一个32位的常数都是合法的立即数,只有能通过上面的构造方法得到的才是合法的立即数。但是若当把一个数按位取反后,则得到一个合法的立即数时,这个数为有效数。此时将mov指令换成mvn指令执行

ARM汇编编译器按照下面的规则来生成立即数的编码
  • 当立即数在0—0xFF范围时,令immediate = immed8 ,rotate = 0;
  • 其他情况下,汇编编译器选择rotate数值最小的编码方式
例:MOV   R0,#0xFC0
         ADD   R0,R1,#0x66

 寄存器方式:

Rm:</
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值