arm架构下读取寄存器信息

 

 void getReg( ) 
{

//根据armcc文档,寄存器不能直接访问,间接访问如下:
 register int r_r0 __asm("r0"); 
 register int r_r1 __asm("r1"); 
 register int r_r2 __asm("r2"); 
 register int r_r3 __asm("r3");
 register int r_r4 __asm("r4"); 
 register int r_r5 __asm("r5"); 
 register int r_r6 __asm("r6"); 
 register int r_r7 __asm("r7");
 register int r_r8 __asm("r8"); 
 register int r_r9 __asm("r9"); 
 register int r_r10 __asm("r10"); 
 register int r_r11 __asm("r11");
 register int r_r12 __asm("r12");
 __asm{
 MOV reg_r[0],r_r0 
 MOV reg_r[1],r_r1
 MOV reg_r[2],r_r2
 MOV reg_r[3],r_r3
 MOV reg_r[4],r_r4
 MOV reg_r[5],r_r5
 MOV reg_r[6],r_r6
 MOV reg_r[7],r_r7
 MOV reg_r[8],r_r8
 MOV reg_r[9],r_r9
 MOV reg_r[10],r_r10
 MOV reg_r[11],r_r11
 MOV reg_r[12],r_r12
 }

//获取sp lr pc寄存器信息,是armcc定义的
 __asm{ 
 MOV reg_r[13], __current_sp()
 MOV reg_r[14], __return_address() 
 MOV reg_r[15], __current_pc()
 }
 u32 r0,r1,r2;

//MRS命令将cpsr aspr等信息保存寄存器
 __asm{
    MRS r0,cpsr
MOV reg_r[16],r0
MRS r1,apsr
MOV reg_r[17],r1
    MRS r2,spsr
MOV reg_r[18],r2
 }

}

还可以利用S文件获取:

    PRESERVE8

    THUMB

    AREA     |.text|, CODE, READONLY
    EXPORT    dumpReg
    IMPORT    buf
 
dumpReg       PROC 
    push      {r0}
    cpsid     i
    ldr       r0, =buf
    add       r0, r0, #4
    stmia     r0!, {r1-r12}
    stmia     r0!, {sp}
    stmia     r0!, {lr}
    mov       r1, pc
    str       r1, [r0], #4
    mrs       r1, cpsr
    str       r1, [r0], #4
    mrs       r1, spsr
    pop       {r0}  
    push      {r1}
    ldr       r1, =regbuf
    str       r0, [r1]
    pop       {r1}
    bx          lr
    cpsie      i
    ENDP
    END

//注释:是将寄存器信息保存到int类型的buf数组里面

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值