繁体   English   中英

qemu-arm分支到看似抽象的指令

[英]qemu-arm branches to a seemingly abstract instruction

我试图为Arm Bear Metal编译的代码构建一个二进制转换器,并尝试通过将其与qemu-arm进行比较来验证正确的执行流程。 我使用以下命令来转储程序流: qemu-arm -d in_asm,cpu -singlestep -D a.flow a.out我注意到了一些奇怪的事情,该程序似乎跳转到无关指令,因为0x000080b4不是分支或0x000093ec之后的下一条指令。

0x000093ec:  1afffff9      bne  0x93d8

R00=00000000 R01=00009c44 R02=00000002 R03=00000000
R04=00000001 R05=0001d028 R06=00000002 R07=00000000
R08=00000000 R09=00000000 R10=0001d024 R11=00000000
R12=f6ffed88 R13=f6ffed88 R14=000093e8 R15=000093ec
PSR=20000010 --C- A usr32
R00=00000000 R01=00009c44 R02=00000002 R03=00000000
R04=00000001 R05=0001d028 R06=00000002 R07=00000000
R08=00000000 R09=00000000 R10=0001d024 R11=00000000
R12=f6ffed88 R13=f6ffed88 R14=000093e8 R15=000093d8
PSR=20000010 --C- A usr32
----------------
IN: 
0x000080b4:  e59f3060      ldr  r3, [pc, #96]   ; 0x811c

实际执行的指令对应于反汇编中<frame_dummy>标签的开始。 有人可以解释一下仿真器中实际发生的情况吗?这种行为在ARM体系结构中是否正常? 该程序使用以下命令编译: arm-none-eabi-gcc --specs=rdimon.specs ac

这是没有CPU状态的程序流的同一段:

0x0000804c:  e59f3018      ldr  r3, [pc, #24]   ; 0x806c
0x00008050:  e3530000      cmp  r3, #0  ; 0x0
0x00008054:  01a0f00e      moveq    pc, lr

----------------
IN: __libc_init_array
0x000093e8:  e1560004      cmp  r6, r4
0x000093ec:  1afffff9      bne  0x93d8

----------------
IN: 
0x000080b4:  e59f3060      ldr  r3, [pc, #96]   ; 0x811c
0x000080b8:  e3530000      cmp  r3, #0  ; 0x0
0x000080bc:  0a000009      beq  0x80e8

这是这部分的分解:

93d4:   0a000005    beq 93f0 <__libc_init_array+0x68>
93d8:   e2844001    add r4, r4, #1
93dc:   e4953004    ldr r3, [r5], #4
93e0:   e1a0e00f    mov lr, pc
93e4:   e1a0f003    mov pc, r3
93e8:   e1560004    cmp r6, r4
93ec:   1afffff9    bne 93d8 <__libc_init_array+0x50>
93f0:   e8bd4070    pop {r4, r5, r6, lr}

这是对先前发出的结核病的反向跳跃,您甚至不必读那么多书:

IN: __libc_init_array
0x000093d8:  e2844001      add  r4, r4, #1  ; 0x1
0x000093dc:  e4953004      ldr  r3, [r5], #4
0x000093e0:  e1a0e00f      mov  lr, pc
0x000093e4:  e1a0f003      mov  pc, r3

----------------
IN: register_fini
0x0000804c:  e59f3018      ldr  r3, [pc, #24]   ; 0x806c
0x00008050:  e3530000      cmp  r3, #0  ; 0x0
0x00008054:  01a0f00e      moveq    pc, lr

----------------
IN: __libc_init_array
0x000093e8:  e1560004      cmp  r6, r4
0x000093ec:  1afffff9      bne  0x93d8

因此,qemu不再显示。 注意,此循环是迭代函数指针,第一个指向register_fini ,第二个指向所讨论的神奇0x000080b4地址(无符号)。 当此未命名的函数有条件地随moveq pc, lr返回时moveq pc, lr控制权将转移回__libc_init_array地址0x000093e8 ,然后该地址确定已到达数组末尾,并再次返回到其调用方0x000093f0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM