2

アームで blx 命令をデコードしたいのですが、ここで良い答えを見つけました: Decoding BLX instruction on ARM/Thumb (IOS)

しかし、私の場合、このヒントを順を追って実行したところ、間違った結果が得られました。理由を教えてもらえますか?

これは私のテストです:

.plt: 000083F0  sub_83F0       ...
...
.text:00008436  FF F7 DC EF    BLX sub_83F0

マシンコード「FF F7 DC EF」を次のように解析します。

   F7 FF EF DC

   11110  1  1111111111  11  1  0  1  1111101110  0  
          S    imm10H        J1    J2   imm10L  

   I1 = NOT(J1 EOR S) = 1  
   I2 = NOT(J2 EOR S) = 1  

   imm32 = SignExtend(S:I1:I2:imm10H:imm10L:00)  
         = SignExtend(1111111111111111110111000)  
         = SignExtend(0x1FFFFB8)  
         = ?  

では、オフセットは 0xFFB8 ですか?
しかし、0x83F0-0X8436-4=0xFFB6
私はあなたの助けが必要です!!!

4

2 に答える 2

3

BLX のターゲットが 32 ビット ARM コードの場合、 の生の値ではなく、命令でエンコードされた即値BLXが に追加されます。align(PC,4)PC

  • PCBLX命令の実行中0x8436 + 4 == 0x843aはARMパイプラインが原因です
  • align(0x843a, 4) == 0x8438

そう:

  • 0x00008438 + 0ffffffb8 == 0x83f0

ARM ARM は<label>、命令の一部のアセンブラー構文でこれについて言及しています。

BLX (エンコーディング T2、A2) の場合、アセンブラは BLX 命令の Align(PC,4) 値からこのラベルまでの必要なオフセット値を計算し、imm32 をそのオフセットに設定するエンコーディングを選択します。

アライメント要件は、ARM ARM の Operation 疑似コードを注意深く読むことによっても見つけることができます。

if ConditionPassed() then
    EncodingSpecificOperations();
    if CurrentInstrSet == InstrSet_ARM then
        next_instr_addr = PC - 4;
        LR = next_instr_addr;
    else
        next_instr_addr = PC;
        LR = next_instr_addr<31:1> : ‘1’;
    if toARM then
        SelectInstrSet(InstrSet_ARM);
        BranchWritePC(Align(PC,4) + imm32);   // <--- alignment of the current PC when BLX to non-Thumb ARM code
    else
        SelectInstrSet(InstrSet_Thumb);
        BranchWritePC(PC + imm32);
于 2013-07-01T06:54:02.313 に答える
0
F7FF
1111011111111111
111 10 11111111111 h = 10 offset upper = 11111111111

EFDC
1110111111011100
111 01 11111011100 h = 01 blx offset upper 11111011100

offset = 1111111111111111011100<<1 
sign extended = 0xFFFFFFB8

0x00008436 + 2 + 0xFFFFFFB8 = 1000083F0
clip to 32 bits 0x000083F0
于 2013-07-01T06:58:26.500 に答える