ちょっと寄り道 __mulsi3(12ステップ本)

__mulsi3をStep9のlib.cに実装してみることにした。

で、まずはkozos.cthread_runのアドレス計算部分を元に戻して、gcc -S kozos.cでアセンブラを出力。
該当部分は次のようになっている。

	mov.w	@(-2,r6),r2
	mov.w	#40,r1
	mov.w	r2,r0
	jsr	@___mulhi3
	mov.w	r0,r2
	mov.w	#_threads,r3
	add.w	r3,r2

r1とr0に2バイトの値を入れて __mulsi3 をコールしてr0に2バイトの値を返すらしい。(実はここにあるのは __mulhi3__mulsi3 じゃないのに後で気が付いた。いつから __mulhi3 になったのかはわからない。)
なので__mulsi3int __mulsi3(int a, int b) として定義すればいいんだと思った。
で、lib.hに次のように定義した。

int __mulsi3(int a, int b);

で、lib.cに次のように実装した。

int __mulsi3(int a, int b)
{
	int res = 0;
	int i;
	if (b > 0) {
		for (i = 0; i < b; i++) {
			res += a;
		}
	} else if (b < 0) {
		for (i = 0; i < -b; i++) {
			res -= a;
		}
	} else {
		return 0;
	}
	puts("a=");
	putxval(a, 0);
	puts(", b=");
	putxval(b, 0);
	puts(", res=");
	putxval(res, 0);
	puts("\n");
	return res;
}

最後のputs文はデバッグのためのメッセージ。
これで、ビルドするとリンクできた。
(何で__mulhi3を実装せず、__mulsi3を実装しただけでリンクエラーにならないのかは不明。)

これで実行したログが以下。

kzload> run
starting from entry point: ffffc020
kozos boot succeed!
a=0, b=38, res=0
a=0, b=38, res=0
a=1, b=38, res=38
a=0, b=38, res=0
a=1, b=38, res=38
a=2, b=38, res=70
a=0, b=38, res=0
a=1, b=38, res=38
a=2, b=38, res=70
a=3, b=38, res=a8
test09_1 started.
test09_1 sleep in.
test09_2 started.
test09_2 sleep in.
test09_3 started.
test09_3 wakeup in (test09_1).
test09_1 sleep out.
test09_1 chpri in.
test09_3 wakeup out.
test09_3 wakeup in (test09_2).
test09_2 sleep out.
test09_2 chpri in.
test09_1 chpri out.
test09_1 wait in.
test09_3 wakeup out.
test09_3 wait in.
test09_2 chpri out.
test09_2 wait in.
test09_1 wait out.
test09_1 trap in.
test09_1 DOWN.
test09_1 EXIT.
test09_3 wait out.
test09_3 exit in.
test09_3 EXIT.
test09_2 wait out.
test09_2 exit.
test09_2 EXIT.
~.
Disconnected.

ちゃんと動いているみたい。

ログを見るとaとbを今の実装と逆に扱った方が良さそう。

ところで__mulhi3は何なの?
lib.cに定義した __mulsi3__mulhi3 にリネームすると undefined reference to `___mulsi3' のリンクエラーになる。

追記:ログをよく見ると sizeof(kz_thread) が0x38(56)になっていて、アセンブラリストの#40と全然違う。単純に sizeof(kz_thread) を手計算してみたら 52(0x34)なのでアラインメントを考えると0x38でいいのかも。

カテゴリー: 12ステップ本, H8 パーマリンク

ちょっと寄り道 __mulsi3(12ステップ本) への2件のフィードバック

  1. kozos のコメント:

    筆者の坂井です。

    乗算が使えるようになるとなにかと便利ですよね。勝手ながら、当ブログを「KOZOS友の会」のほうで紹介させていただきました。
    12ステップ本ですが、GWの祝日に「もくもく会」というイベントを行います。場所は神奈川なのですが、よければぜひ参加をご検討ください。
    http://atnd.org/events/15186

  2. yuji のコメント:

    __mulsi3と__mulhi3の違いなどよくわかっていない部分もありますが、坂井さんのご判断でご紹介していただいてけっこうです。
    「もくもく会」お誘いいただいてありがとうございます。
    以前から「もくもく会」には参加したいと思っていましたが、私、千葉の外房なのでちょっと遠いです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA