2016-07-04 18 views
0

次のコードは、マシンがループのasmとして生成したものです。 r60x98548の値を保持 bxne r6を、:0x98564 <+228>: bne 0x98548条件付き分岐(BXNE!?)

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 

、それは以下のように、レジスタ内の場所に支店を持つこの行を置き換えることができるのですか?

+2

試したときに何が起こりましたか?実際の問題は何ですか? –

+0

@SamKuhmonenこれはarmv7で動作しますが、アームの親指では動作しません。 – RyanB

+1

はい、親指モードでは 'BX'だけが利用でき、' BXNE'は親指モードでは利用できません。あなたはおそらくそれを行うために 'IT'を使うことができます。 –

答えて

0

OPがユニファイドシンタックスを使用していたことをどのように知っていますか?私は、コマンドラインがまだアセンブラエラーが発生し上.thumbと-mcpu =皮質-M0と

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

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

で解体が

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

参照してください。それはITブロックを生成していません。統一された構文なし

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

ARM命令は、すべての命令(aarch32)に条件文のための4つのビットを持って、親指はあなたではなく、BXなどの条件すべてをすることができません。 bxが必要な場合でも、ITブロックを使用するか、通常の条件付きブランチを使用してbxに分岐するか、またはbxの周りに分岐する必要があります(アーム/サム間でモードを切り替えるかどうか)。