使用BXに親指のコードを呼び親指の機能をジャンプへの指令に別の機能
質問
ようにしている学ぶ技術に有用なファームウェアmoddingる思っていたソースコード) これらの問題の使用BXから親指コードにジャンプやその他の既存の親指のコードです。
- 使い方を教えてくださいBXジ、既存のファームウェアのサムコードから親指のコードです。
- 使い方を教えてください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
ここちよいかわかりません:
アドレスのR2がないlsbビットセット---でん
bx r2
スイッチモードアームモード??の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いと思いままでに多くのゴミ箱です。