arm汇编指令理解

blx指令
76 09 00 FA


FA 00 09 76


31 30 29 28 27 26 25 24   23                             0
1  1  1  1  1  0  1  0(H) 0  000 0000 0000 1001 0111 011 0


最高4位表示执行条件
1111无条件执行
101
固定指令码
H=0
signed_immed_24
000976


pc = pc + (SignExtend(signed_immed_24)<<2) + (H<<1)
0000 0000 0010 0101 1101 1000
0025d8




38 11 9F E5




ldr指令


2f5c: e59f1138 ldr r1, [pc, #312] ; 0x309c
e59f1138


1110 0101 1001 1111 0001  0001 0011 1000
bit31-28 1110 无条件执行
bit27-26 01   固定编码
bit25 0 0     固定编码
bit24 1 1     固定编码




bit23 U 1
    if( U == 1 ){
        address = Rn + offset_12;
    }else{  
        address = Rn-offset_12;
    }



bit22 B 0
if( B==1 ){
    指令访问无符号字节数据
}else{
    字数据
}
bit21 0 固定编码
bit20 L 1
if(L==1){
   ldr指令  load
}else{
   str指令  store
}
bit19-16 Rn 基址寄存器  1111  r15 pc
bit15-12 Rd 目的寄存器  0001  r1
bit11-0  offset_12 地址偏移量
2f5c: e59f1138 ldr r1, [pc, #312] ; 0x309c


加载(pc+0x138)地址里面的内容(字32bit)送到r1寄存器
0x2f5c+0x138 = 0x3094


0x309c = 0x3094 + 8
为什么加8, 3级流水线


加载0x309c地址的一个字到r1
还有一个信息,此处的装载属于与位置无关的代码,因为基址是pc
也就是说此代码在内存的任何地址都可以得到正确执行。
uboot加载到内存执行,即属于此类
关键再配合adr绝对取地址指令.....


bin文件linux平台反汇编指令:
arm-linux-androideabi-objdump -D -b binary -m arm  boot0_sdcard_sun8iw5p1.bin >boot0asm.asm













































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值