有条件的分支(BXNE!?)

时间:2016-07-04 02:38:04

标签: assembly arm thumb

以下代码是机器生成的循环asm。

ps aux | grep "script.py"

0x98548 <+200>: sub.w r0, r7, #0xe 0x9854c <+204>: ldr r1, [sp, #0x8] 0x9854e <+206>: add r0, r1 0x98550 <+208>: str r0, [sp, #0x4] 0x98552 <+210>: ldr r0, [sp, #0x8] 0x98554 <+212>: adds r0, #0x1 0x98556 <+214>: str r0, [sp, #0x8] 0x98558 <+216>: ldr r0, [sp, #0x4] 0x9855a <+218>: sub.w r1, r7, #0x35 0x9855e <+222>: blx 0x9bfec ; symbol stub for: strcmp 0x98562 <+226>: cmp r0, #0x0 0x98564 <+228>: bne 0x98548 ,是否可以将此行替换为分支到寄存器中的位置,如下所示: 0x98564 <+228>: bne 0x98548,其中bxne r6包含r6的值?

1 个答案:

答案 0 :(得分:0)

您是如何知道OP使用统一语法的?我看到那里的反汇编

.syntax unified
.thumb
nop
nop
bxne r0
nop
nop
nop
skip:
nop
nop
nop

使用.thumb

so.s: Assembler messages:
so.s:6: Error: thumb conditional instruction should be in IT block -- `bxne r0'

00000000 <skip-0x18>:
   0:   e1a00000    nop         ; (mov r0, r0)
   4:   e1a00000    nop         ; (mov r0, r0)
   8:   112fff10    bxne    r0
   c:   e1a00000    nop         ; (mov r0, r0)
  10:   e1a00000    nop         ; (mov r0, r0)
  14:   e1a00000    nop         ; (mov r0, r0)

00000018 <skip>:
  18:   e1a00000    nop         ; (mov r0, r0)
  1c:   e1a00000    nop         ; (mov r0, r0)
  20:   e1a00000    nop         ; (mov r0, r0)
在命令行中使用.thumb和-mcpu = cortex-m0

仍会产生汇编程序错误。它没有生成IT块。

没有统一的语法

so.s: Assembler messages:
so.s:5: Error: Thumb does not support conditional execution

ARM指令在每条指令(aarch32)上都有四位用于条件,拇指不是你不能包括bx在内的一切条件。如果你甚至需要bx(你是在arm / thumb之间切换模式),你必须使用IT块或使用普通条件分支分支到bx或其周围。