您的位置 首页 知识

浅述ARM汇编的当即数

大多数的数据处理指令和部分状态寄存器访问指令用到立即数,在ARM中不是所有数都能用作立即数;一条典型的ARM汇编语法格式:opcode>{cond}…

大多数的数据处理指令和部分状况寄存器拜访指令用到当即数,在ARM中不是所稀有都能用作当即数;

一条典型的ARM汇编语法格局:

{cond}{S} ,,

其间 opcode: 指令助记符,如ADD、SUB、MOV等;
cond: 条件码助记符,如EQ(0000)、NE(0001)、AL(1110)等;
S:假如指令有S后缀,则该指令的操作会影响CPSR的值;
Rd:方针寄存器;
Rn: 包括第一个源操作数的寄存器;
shifter_operand: 表明第二个源操作数,可认为当即数。

一条典型的ARM汇编编码格局:

操作数的语法格局:
#
其间,=immed_8循环右移(2*rotate_imm)

immediate: 当即数
immed_8 : 8位的常数
rotate_imm: 4位的循环右移值

意思是每个当即数都是由一个8位的常循环右移偶数位得到。

ROR 循环右移:行将操作数循环按指定的数量向右循环移位,左面用右边移出的位来填充;

例如:有用的当即数:0x104、0xff0
immediate : 0x104// 0001 0000 0100
immed_8 : 0x81// 0100 0001
左面补0: 0x00000081// 0000 0000 0000 0000 0000 0000 1000 0001
rotate_imm: 15 // 循环右移(2*15)位
// 0000 0000 0000 0000 0000 0001 0000 0100
// 0x0000 0104

immediate : 0xff0 // 1111 1111 0000
immed_8: 0xff// 1111 1111
左面补0: 0x000000ff// 0000 0000 0000 0000 0000 0000 1111 1111
rotate_imm: 14// 循环右移(2*14)位
// 0000 0000 0000 0000 0000 1111 1111 0000
// 0x0000 0ff0

无效的当即数不能经过上面的结构办法得到:0x101、0x102、0xff1
0x101:0001 0000 0001(不能经过一个八位常数取得)
0x102: 0001 0000 0010(不能经过移动偶数位取得)
0xff1: 1111 1111 0001

可是有时候用呈现这种状况,如:0x3f0
可认为:#0x3f,ror (2*14)
或: #0xfc,ror (2*15)

面临这种状况,ARM有如下规矩:
1. 当当即数的值0-0xFF时,immed_8=,rotate_imm=0;
2. 其它状况下,汇编编译器挑选使rotate_imm的数值最小的编码方法.

所以0x3f0 是经过 0x3f>>(2*14) 的方法取得。

LDR伪指令: 装入32位当即数或地址到寄存器

语法: LDR{} ,=[|label-expr]

expr表明32位常数

eg:

ldr r3,=0xFFF
ldr r1, =12345678

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/277107.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部