以下代码是机器生成的循环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
的值?
答案 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或其周围。