[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: OpenBlockSS
あーごめんなさい。
> > lis 9,0xef600700@h /* @ha ではなくて @l */
lis 9,0xef600700@h /* @ha ではなくて @h */
です。コメントが違います。
addi のオペランドは符号つきなので上位16ビットが調整を受けます。
その場合は @ha です。ori は符号拡張なしなので @h です。
>の typo と思っていいでしょうか? ちなみに他の値を書く場合は
>
> li 0,0x12345678
>
>なんですよね、きっと。
0x12345678 のような16ビット幅をこえる即値をロードしたいので
あれば2命令必要になります。
lis 3,0x12345678@ha
addi 3,3,0x12345678@l
とか。lis が上位16ビットのロードで addi がそれに対する下位16
ビット分の足し算です。だから 0x12340000 とか 0x5678 なら1命令
でいけます。
なお、r0 をつかうときは注意しましょう。命令によってレジスターの
内容を使う場合と、値 0 として扱われる場合があります。
# 私は説明が下手だから解説書を読んでください。:-)
>言ってはる意味は想像はできますが....
ブートローダーをさわることができるならやることは簡単ですよ。
呼び出したいコードをブートローダーの中に C で書いておいて、
そのアドレスを調べておき、locore.S の中で、
lis 3,そのアドレス@ha
addi 3,3,そのアドレス@l
mtlr 3 /* lr ← r3 */
blrl /* call lr */
とかするだけですから。