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数组里面

你可能感兴趣的:(arm架构下读取寄存器信息)