使用BXに親指のコードを呼び親指の機能をジャンプへの指令に別の機能

StackOverflow https://stackoverflow.com/questions/9368360

  •  28-10-2019
  •  | 
  •  

質問

ようにしている学ぶ技術に有用なファームウェアmoddingる思っていたソースコード) これらの問題の使用BXから親指コードにジャンプやその他の既存の親指のコードです。

  1. 使い方を教えてくださいBXジ、既存のファームウェアのサムコードから親指のコードです。
  2. 使い方を教えてくださいBX呼び既存の親指の機能の設定によりLR最初から親指のコードです。

私の理解では、このcpuを見lsbビット(bit0)をしています必ずこの設定 1 守るために、cpuの状態を"親指にいるときでした。って追加1、lsbのビットが1になります。

なので---と言いたいだけにジャンプ0x24000の中の一部の既存の親指コード)

LDR R6, =0x24000
ADD R6, #1       @ (set lsb to 1)
BX R6

この適切なものはどれですか。

今言を呼びたい、既存の親指の機能を使用BXっていない場合については、戻りになると思って設定する必要LRがたいです。

でも、機能を呼びたいで0x24000 たので 示唆された 利用:

ldr r2, =0x24000
mov lr, pc
bx r2

ここちよいかわかりません:

  1. アドレスのR2がないlsbビットセット---でん bx r2 スイッチモードアームモード??

  2. のLR..PCのアドレス(噴流-指導+4),いたしました。両親指、腕の指導はアドレスが配置する(16ビットと32ビット)でないのLSBビットセットが1になります。限の奇数lsbビットセットが1になります。

で上記のコードの私設定LR(PC)は、アドレスを持たないlsbビット1セットです。がなくなった時点で機能を呼んだときにこのエピローグとは BX LR,...uhmmm..どのようにする仕事に戻親指のコードについて教えてください。私は必ず何かが足りない...

通常はBLが呼ばれます。マニュアルとBLの命令セットのLRのラインのコー---なのでそれでは(通常) BL 親指の指示の安定を図る return addr + 1 しまうのですか?

役に立ちましたか?

解決

なんと、呼び出してくれるありがとうございます。知っていたのqemuコード http://github.com/dwelch67/yagbat と思XPUT32るPUT32方法について説明していただけます。では表示されません。作成した複数の実験で、かなり驚くことではありませんでした。その理由は、gnuリンカーは何です。申し訳あ対応ものだと思うようになります。での混乱、知っていたので間違えた年間の思考のpcユのモードビット周辺ものだ.

する前に、まずは実験結果は、以下の場合も一緒に戦ってくれるかなということ:

LDR R6, =0x24000
ADD R6, #1       @ (set lsb to 1)
BX R6

でいることを知0x24000は親指コードだけでなく:

LDR R6, =0x24001
BX R6

あり、ただく方法で支店へのサムコードからアームまたは親指せてもらう良い機会になりそうだったハードコード住所0x24000は親指を指導すbx、登録のアドレスプラスします。

まほかの住所が名前をお知らせくださいアドレス

ldr r6,=something
bx r6

嬉しいことであると思うので、それを何とかできるアームまたは親指住所、上記のコードはいいものです。それは作品の場合はリンカーを適切に知ってどのようなラベルアームまたは親指場がすぐそもそも太陽系つ作品としてはこちらでご覧いただけ

.thumb
ping:
    ldr r0,=pong
    bx r0
.code 32
pong:
    ldr r0,=ping
    bx r0


d6008148 <ping>:
d6008148:   4803        ldr r0, [pc, #12]   ; (d6008158 <pong+0xc>)
d600814a:   4700        bx  r0

d600814c <pong>:
d600814c:   e59f0008    ldr r0, [pc, #8]    ; d600815c <pong+0x10>
d6008150:   e12fff10    bx  r0

d6008158:   d600814c    strle   r8, [r0], -ip, asr #2
d600815c:   d6008148    strle   r8, [r0], -r8, asr #2

このビーチに位置作業のたポンプ、親指から0xD600815Cましたが腕アドレスです。

これらはすべてのgnuアセンブラもちなみに、その他のツールできていません。ガス置する必要があります.thumb_func前にラベルをつけることにしたい宣言されたとして親指のラベル(funcる機能が誤解を招くおかげで、練習にいてどのようにお考えですか。thumb_func手段ではアセンブラ/リンカーを展示予定です。

.thumb
.thumb_func
ping:
    ldr r0,=pong
    bx r0
.code 32
pong:
    ldr r0,=ping
    bx r0

今まで何をしたかった

d6008148 <ping>:
d6008148:   4803        ldr r0, [pc, #12]   ; (d6008158 <pong+0xc>)
d600814a:   4700        bx  r0

d600814c <pong>:
d600814c:   e59f0008    ldr r0, [pc, #8]    ; d600815c <pong+0x10>
d6008150:   e12fff10    bx  r0

d6008158:   d600814c    strle   r8, [r0], -ip, asr #2
d600815c:   d6008149    strle   r8, [r0], -r9, asr #2

0xD600815Cるlsbitを設定することでしょています。コンパイラのすべての場合、このメを確認することができま電話Cの機能です。のためのアセンブラもいます。thumb_func(またはその他の指令ある場合にガスを知ることは親指のラベルに設定しlsbitます。

ので、以下の実験を行い、mpcoreをARM11もたtestthumb機能1~4にARM7TDMI、qemu同じ。

.globl testarm
testarm:
    mov r0,pc
    bx lr

armbounce:
    mov r0,lr
    bx lr

.thumb
.thumb_func
.globl testthumb1
testthumb1:
    mov r0,pc
    bx lr
    nop
    nop
    nop
bounce:
    bx lr
.thumb_func
.globl testthumb2
testthumb2:
    mov r2,lr
    mov r0,pc
    bl bounce
    bx r2
    nop
    nop
    nop
.thumb_func
.globl testthumb3
testthumb3:
    mov r2,lr
    mov lr,pc
    mov r0,lr
    bx r2
    nop
    nop
    nop
.thumb_func
.globl testthumb4
testthumb4:
    push {lr}
    ldr r2,=armbounce
    mov r1,pc  ;@ -4
    add r1,#5  ;@ -2
    mov lr,r1  ;@ +0
    bx r2      ;@ +2
    pop {r2}   ;@ +4
    bx r2
.thumb_func
.globl testthumb5
testthumb5:
    push {lr}
    ldr r2,=armbounce
    mov lr,pc
    bx r2
    pop {r2}
    bx r2
.thumb_func
.globl testthumb6
testthumb6:
    push {lr}
    bl testthumb6a
.thumb_func
testthumb6a:
    mov r0,lr
    pop {r2}
    bx r2

.thumb_func
.globl testthumb7
testthumb7:
    push {lr}
    bl armbounce_thumb
    pop {r2}
    bx r2

.thumb_func
.globl testthumb8
testthumb8:
    push {lr}
    bl armbounce_thumb_two
    pop {r2}
    bx r2

.align 4
armbounce_thumb:
    ldr r1,[pc]
    bx r1
.word armbounce

nop
.align 4
armbounce_thumb_two:
    bx pc
    nop
.code 32
    b armbounce

となる

d60080b4 <testarm>:
d60080b4:   e1a0000f    mov r0, pc
d60080b8:   e12fff1e    bx  lr

d60080bc <armbounce>:
d60080bc:   e1a0000e    mov r0, lr
d60080c0:   e12fff1e    bx  lr

d60080c4 <testthumb1>:
d60080c4:   4678        mov r0, pc
d60080c6:   4770        bx  lr
d60080c8:   46c0        nop         ; (mov r8, r8)
d60080ca:   46c0        nop         ; (mov r8, r8)
d60080cc:   46c0        nop         ; (mov r8, r8)

d60080ce <bounce>:
d60080ce:   4770        bx  lr

d60080d0 <testthumb2>:
d60080d0:   4672        mov r2, lr
d60080d2:   4678        mov r0, pc
d60080d4:   f7ff fffb   bl  d60080ce <bounce>
d60080d8:   4710        bx  r2
d60080da:   46c0        nop         ; (mov r8, r8)
d60080dc:   46c0        nop         ; (mov r8, r8)
d60080de:   46c0        nop         ; (mov r8, r8)

d60080e0 <testthumb3>:
d60080e0:   4672        mov r2, lr
d60080e2:   46fe        mov lr, pc
d60080e4:   4670        mov r0, lr
d60080e6:   4710        bx  r2
d60080e8:   46c0        nop         ; (mov r8, r8)
d60080ea:   46c0        nop         ; (mov r8, r8)
d60080ec:   46c0        nop         ; (mov r8, r8)

d60080ee <testthumb4>:
d60080ee:   b500        push    {lr}
d60080f0:   4a15        ldr r2, [pc, #84]   ; (d6008148 <armbounce_thumb_two+0x8>)
d60080f2:   4679        mov r1, pc
d60080f4:   3105        adds    r1, #5
d60080f6:   468e        mov lr, r1
d60080f8:   4710        bx  r2
d60080fa:   bc04        pop {r2}
d60080fc:   4710        bx  r2

d60080fe <testthumb5>:
d60080fe:   b500        push    {lr}
d6008100:   4a11        ldr r2, [pc, #68]   ; (d6008148 <armbounce_thumb_two+0x8>)
d6008102:   46fe        mov lr, pc
d6008104:   4710        bx  r2
d6008106:   bc04        pop {r2}
d6008108:   4710        bx  r2

d600810a <testthumb6>:
d600810a:   b500        push    {lr}
d600810c:   f000 f800   bl  d6008110 <testthumb6a>

d6008110 <testthumb6a>:
d6008110:   4670        mov r0, lr
d6008112:   bc04        pop {r2}
d6008114:   4710        bx  r2

d6008116 <testthumb7>:
d6008116:   b500        push    {lr}
d6008118:   f000 f80a   bl  d6008130 <armbounce_thumb>
d600811c:   bc04        pop {r2}
d600811e:   4710        bx  r2

d6008120 <testthumb8>:
d6008120:   b500        push    {lr}
d6008122:   f000 f80d   bl  d6008140 <armbounce_thumb_two>
d6008126:   bc04        pop {r2}
d6008128:   4710        bx  r2
d600812a:   46c0        nop         ; (mov r8, r8)
d600812c:   46c0        nop         ; (mov r8, r8)
d600812e:   46c0        nop         ; (mov r8, r8)

d6008130 <armbounce_thumb>:
d6008130:   4900        ldr r1, [pc, #0]    ; (d6008134 <armbounce_thumb+0x4>)
d6008132:   4708        bx  r1
d6008134:   d60080bc            ; <UNDEFINED> instruction: 0xd60080bc
d6008138:   46c0        nop         ; (mov r8, r8)
d600813a:   46c0        nop         ; (mov r8, r8)
d600813c:   46c0        nop         ; (mov r8, r8)
d600813e:   46c0        nop         ; (mov r8, r8)

d6008140 <armbounce_thumb_two>:
d6008140:   4778        bx  pc
d6008142:   46c0        nop         ; (mov r8, r8)
d6008144:   eaffffdc    b   d60080bc <armbounce>
d6008148:   d60080bc            ; <UNDEFINED> instruction: 0xd60080bc
d600814c:   e1a00000    nop         ; (mov r0, r0)

その結果を呼び出すと、印刷全てのこれらの機能

D60080BC testarm
D60080C8 testthumb1
D60080D6 testthumb2
D60080E6 testthumb3
D60080FB testthumb4
         testthumb5 crashes
D6008111 testthumb6
D600811D testthumb7
D6008127 testthumb8

ここでいることや、どのようないご質問です。この混合モードから呼び出し指のモードからもアームをより簡単)

私はグアーム、サムモードでこのレベルが長年に渡っていたこと間違えるまでに時間がかかります。と思ったのカウンタープログラムが開催されるモードにlsbitっているという設定は設定しないときなbx。

早CPUのARMプロセッサのアームの建築リファレンスマニュアル(書いていてアセンブラのすべてこない場合にはほとんどのご質問に回答をさ).

Program counter Register 15 is the Program Counter (PC). It can be used in most
      instructions as a pointer to the instruction which is two instructions after 
      the instruction being executed...

できいてはこちらをご確認くださいどうりつつあることを実感している、ということは、アームモードの二つの指示、8バイト先は?およびサムモードでは、二人の指先には4バイト先は?

でtestarmを確認するにはカウンタープログラムは、8バイト。でも二つです。

testthumb1を確認するプログラムの4バイト先は、この場合もに示します。

testthumb2

d60080d2:   4678        mov r0, pc
d60080d4:   f7ff fffb   bl  d60080ce <bounce>
d60080d8:   4710        bx  r2

の場合はカウンタープログラムした"指示"ヘッドを取得し0xD60080D8その代わりにく0xD60080D6はバイト先が多いです。アームモードに8バイト先のサムモードに4バイト先は、釣復号を指示(データ)を先駆け実行されるコードは、追加は4点または8.

testthumb3たいmov lr,pcた、configure.

まだのパターンにlsbitプログラムのカウンターが設定されていない、あるいはっこうのためのブランチテーブルです。でmov lr,pcサムモードはリンク設定は行わないでください登録権を返します。

testthumb4非常に苦しい方は、カウンタープログラムもこのコードが 最後に基づき厳重に指示し、計算の返送先住所を変更した場合に、その命令列の間のmov r1,pcおよびbx r2いretuneの追加.今だってだって思ったこと。

add r1,pc,#1
bx r2

と親指の指示をお客さんは、thumb2いと思います。あれのプロセッサ(armv7)の支援の両アームの指示とサム/thumb2なるでしょうがいいが、元の追加#1でthumb2追加指示があればできる上層レジスタやオペランドが4バイトの親指が2ました。(ば追加する必要があり#3).

でtestthumb5はから直接コードでつながる部分のことがクラッシュします。このなかで、申し訳ありませんか誤解を与えるうえは問題なかったと思います。に戻り、パッチまでの質問に使用したことです。

testthumb6は実験してくれているのです。すべては、リンクの登録は実際のlsbit設定できbx lr後に知り尽くしのモードからます。

testthumb7こからはアーム側のトランポリンが見えますリンカー時からアームモードサムモードでは、この場合でも今から親指のモードをアームモードになります。ぜんのリンカーです。で親指のモードで使用低登録およびこの時点で、ゲーム後のコードが作成されるリンカーはん登録することもできるしていたのを修正しました。にアームモードのip登録、などであっr12、trashedうためのコンパイラを利用します。知っているこの場合r1きtrashedで、この作品にしてから行ってください。のarmbounceコードが呼び出されるヘリンクを登録する場合が戻り、親指令(lsbitセット)後、bl armbounce_thumbのtestthumb7機能が正しかったです。

testthumb8これはどのようにgnuリンカーはんありがとうございます残りのニーズからサムモードアームモードになります。この記事の指示にとらわれることなく、トランポリン.そして、なんとかもトリッキー、クレイジ。

d6008140 <armbounce_thumb_two>:
d6008140:   4778        bx  pc
d6008142:   46c0        nop         ; (mov r8, r8)
d6008144:   eaffffdc    b   d60080bc <armbounce>

A bx。い実験上のパソコンはバイトは、まることも分かっていることで、このlsbitが設定されていません。うことが言いたいのは、支店をアームにコードでバイトは今後ます。のノップは二つのバイトスペーサーにして形成されるARM命令バイト先およびアライメント調整をして、四つのバイト境界に、また無条件の支店をも場所を作ることができるa bもしくはldr pc=何かによってどこまでが必要です。エクスペディア.

元のbl arm_bounce_thumb_twoを定め、さまざまなリンクの登録の命令その後bl.のトランポリンな変更リンクを登録しだけを行います。

取得する場合にサムモードからアームを入れていくかをリンカーは:

...
bl myfun_from_arm
...


myfun_from_arm:
  ldr ip,[pc]
  bx ip
.word myfun

るようになりますがいい(注から別のバイナリーな0xD6008xxxが0x0001xxxx).

   101f8:   eb00003a    bl  102e8 <__testthumb1_from_arm>


000102e8 <__testthumb1_from_arm>:
   102e8:   e59fc000    ldr ip, [pc]    ; 102f0 <__testthumb1_from_arm+0x8>
   102ec:   e12fff1c    bx  ip
   102f0:   00010147    andeq   r0, r1, r7, asr #2

でもこのipレジスタ(r12?) もっ心trashingいと思いままでに多くのゴミ箱です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top