[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 */

とかするだけですから。