反汇编调试-从寄存器级看程序运行

文章详细阐述了在程序执行过程中,主函数如何调用子函数,并通过保存LR、PC、IP和FP寄存器的值来管理调用过程。IP寄存器用于备份栈地址,子函数返回时,通过恢复这些寄存器的值,尤其是将LR的值赋予PC,实现返回到调用点。示例代码展示了这种机制在实际操作中的应用。

反汇编调试-从寄存器级看程序运行说明主函数在调用子函数保存下一条指令的地址到lr寄存器中;跳转到子函数保存pc、lr、ip、fp四个寄存器的https://mp.weixin.qq.com/s?__biz=Mzg3NDkwMjc2NA==&mid=2247483769&idx=1&sn=33ea693f9adcbb7d128b5b34ecdc5cae&chksm=cec8e4faf9bf6dec0e743697628aceafd0b2dfbe6603bea12e66e9bf86d830c22af6e748f917#rd

  • 主函数在调用子函数

  • 保存下一条指令的地址到lr寄存器中;

  • 跳转到子函数

  • 保存pc、lr、ip、fp四个寄存器的值到内存中;其中ip的作用是备份栈地址;

  • 当子函数返回时,恢复保存在栈中的寄存器的值(通过直接修改pc寄存器的方式(在恢复现场的时候,把原lr保存的值赋值给pc实现),实现子函数返回。)

  • 主函数在调用子函数

  • 保存下一条指令的地址到lr寄存器中;

  • 跳转到子函数

  • 保存pc、lr、ip、fp四个寄存器的值到内存中;其中ip的作用是备份栈地址;

  • 当子函数返回时,恢复保存在栈中的寄存器的值(通过直接修改pc寄存器的方式(在恢复现场的时候,把原lr保存的值赋值给pc实现),实现子函数返回。)


00000000 <_start>:
   0:  e3a00a01   mov  sp, #4096  ; 0x1000
   4:  eb000049   bl  130 <main>


00000008 <halt>:
   8:  eafffffe   b  8 <halt>


-> 0000000c <LedInit>:
   c:  e1a0c00d   mov  ip, sp
  10:  e92dd800   stmdb  sp!, {fp, ip, lr, pc}
  14:  e24cb004   sub  fp, ip, #4  ; 0x4
  18:  e3a0220e   mov  r2, #-536870912  ; 0xe0000000
  1c:  e2822602   add  r2, r2, #2097152  ; 0x200000
  20:  e2822d0a   add  r2, r2, #640  ; 0x280
  24:  e3a0320e   mov  r3, #-536870912  ; 0xe0000000
  28:  e2833602   add  r3, r3, #2097152  ; 0x200000
  2c:  e2833d0a   add  r3, r3, #640  ; 0x280
  30:  e5933000   ldr  r3, [r3]
  34:  e1a03823   mov  r3, r3, lsr #16
  38:  e1a03803   mov  r3, r3, lsl #16
  3c:  e5823000   str  r3, [r2]
  40:  e3a0220e   mov  r2, #-536870912  ; 0xe0000000
  44:  e2822602   add  r2, r2, #2097152  ; 0x200000
  48:  e2822d0a   add  r2, r2, #640  ; 0x280
  4c:  e3a0320e   mov  r3, #-536870912  ; 0xe0000000
  50:  e2833602   add  r3, r3, #2097152  ; 0x200000
  54:  e2833d0a   add  r3, r3, #640  ; 0x280
  58:  e5933000   ldr  r3, [r3]
  5c:  e3833c11   orr  r3, r3, #4352  ; 0x1100
  60:  e3833011   orr  r3, r3, #17  ; 0x11
  64:  e5823000   str  r3, [r2]
  68:  e3a0220e   mov  r2, #-536870912  ; 0xe0000000
  6c:  e2822602   add  r2, r2, #2097152  ; 0x200000
  70:  e2822fa3   add  r2, r2, #652  ; 0x28c
  74:  e3a0320e   mov  r3, #-536870912  ; 0xe0000000
  78:  e2833602   add  r3, r3, #2097152  ; 0x200000
  7c:  e2833fa3   add  r3, r3, #652  ; 0x28c
  80:  e5933000   ldr  r3, [r3]
  84:  e38330ff   orr  r3, r3, #255  ; 0xff
  88:  e5823000   str  r3, [r2]
  8c:  e3a0220e   mov  r2, #-536870912  ; 0xe0000000
  90:  e2822602   add  r2, r2, #2097152  ; 0x200000
  94:  e2822fa2   add  r2, r2, #648  ; 0x288
  98:  e3a0320e   mov  r3, #-536870912  ; 0xe0000000
  9c:  e2833602   add  r3, r3, #2097152  ; 0x200000
  a0:  e2833fa2   add  r3, r3, #648  ; 0x288
  a4:  e5933000   ldr  r3, [r3]
  a8:  e3c330ff   bic  r3, r3, #255  ; 0xff
  ac:  e5823000   str  r3, [r2]
  b0:  e3a0220e   mov  r2, #-536870912  ; 0xe0000000
  b4:  e2822602   add  r2, r2, #2097152  ; 0x200000
  b8:  e2822fa2   add  r2, r2, #648  ; 0x288
  bc:  e3a0320e   mov  r3, #-536870912  ; 0xe0000000
  c0:  e2833602   add  r3, r3, #2097152  ; 0x200000
  c4:  e2833fa2   add  r3, r3, #648  ; 0x288
  c8:  e5933000   ldr  r3, [r3]
  cc:  e38330aa   orr  r3, r3, #170  ; 0xaa
  d0:  e5823000   str  r3, [r2]
  d4:  e3a0220e   mov  r2, #-536870912  ; 0xe0000000
  d8:  e2822602   add  r2, r2, #2097152  ; 0x200000
  dc:  e2822fa1   add  r2, r2, #644  ; 0x284
  e0:  e3a0320e   mov  r3, #-536870912  ; 0xe0000000
  e4:  e2833602   add  r3, r3, #2097152  ; 0x200000
  e8:  e2833fa1   add  r3, r3, #644  ; 0x284
  ec:  e5933000   ldr  r3, [r3]
  f0:  e383300f   orr  r3, r3, #15  ; 0xf
  f4:  e5823000   str  r3, [r2]
  f8:  e89da800   ldmia  sp, {fp, sp, pc}


-> 000000fc <Delay>:
  fc:  e1a0c00d   mov  ip, sp
 100:  e92dd800   stmdb  sp!, {fp, ip, lr, pc}
 104:  e24cb004   sub  fp, ip, #4  ; 0x4
 108:  e24dd004   sub  sp, sp, #4  ; 0x4
 10c:  e50b0010   str  r0, [fp, #-16]
 110:  e51b3010   ldr  r3, [fp, #-16]
 114:  e2433001   sub  r3, r3, #1  ; 0x1
 118:  e50b3010   str  r3, [fp, #-16]
 11c:  e51b3010   ldr  r3, [fp, #-16]
 120:  e3730001   cmn  r3, #1  ; 0x1
 124:  0a000000   beq  12c <Delay+0x30>
 128:  eafffff8   b  110 <Delay+0x14>
 12c:  e89da808   ldmia  sp, {r3, fp, sp, pc}


-> 00000130 <main>:
 130:  e1a0c00d   mov  ip, sp
 134:  e92dd800   stmdb  sp!, {fp, ip, lr, pc}
 138:  e24cb004   sub  fp, ip, #4  ; 0x4
 13c:  e24dd004   sub  sp, sp, #4  ; 0x4
 140:  e3a03000   mov  r3, #0  ; 0x0
 144:  e50b3010   str  r3, [fp, #-16]
-> 148:  ebffffaf   bl  c <LedInit>
 14c:  e3a0220e   mov  r2, #-536870912  ; 0xe0000000
 150:  e2822602   add  r2, r2, #2097152  ; 0x200000
 154:  e2822fa1   add  r2, r2, #644  ; 0x284
 158:  e3a0320e   mov  r3, #-536870912  ; 0xe0000000
 15c:  e2833602   add  r3, r3, #2097152  ; 0x200000
 160:  e2833fa1   add  r3, r3, #644  ; 0x284
 164:  e5933000   ldr  r3, [r3]
 168:  e3c3300f   bic  r3, r3, #15  ; 0xf
 16c:  e5823000   str  r3, [r2]
 170:  e3a00713   mov  r0, #4980736  ; 0x4c0000
 174:  e2800c4b   add  r0, r0, #19200  ; 0x4b00
 178:  e2800040   add  r0, r0, #64  ; 0x40
 -> 17c:  ebffffde   bl  fc <Delay>
 180:  e3a0220e   mov  r2, #-536870912  ; 0xe0000000
 184:  e2822602   add  r2, r2, #2097152  ; 0x200000
 188:  e2822fa1   add  r2, r2, #644  ; 0x284
 18c:  e3a0320e   mov  r3, #-536870912  ; 0xe0000000
 190:  e2833602   add  r3, r3, #2097152  ; 0x200000
 194:  e2833fa1   add  r3, r3, #644  ; 0x284
 198:  e5933000   ldr  r3, [r3]
 19c:  e383300f   orr  r3, r3, #15  ; 0xf
 1a0:  e5823000   str  r3, [r2]
 1a4:  e3a03000   mov  r3, #0  ; 0x0
 1a8:  e1a00003   mov  r0, r3
 1ac:  e89da808   ldmia  sp, {r3, fp, sp, pc}
Disassembly of section .comment:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值