Home > スポンサー広告 > TempAR - 0xD0 コードタイプ さんぷる?

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

コメント: -

Home > スポンサー広告 > TempAR - 0xD0 コードタイプ さんぷる?

Home > TempAR Usage > TempAR - 0xD0 コードタイプ さんぷる?

TempAR - 0xD0 コードタイプ さんぷる?


0xD0コードのサンプル。
分かりやすいかどうか分からないが。

■サンプル

_S *
_G TempAR Test

_C0 --- 0xD0 * 1 -------
_M 0xD3000000 0x08801000 # オフセットを08801000に設定
_M 0xD5000000 0x11111111 # レジスターに値0x11111111を設定

_M 0xC0000000 0x00000001 # ループ+1回
_M 0x40000000 0x00000001 # オフセット0+現在オフセットのアドレスの値が1より大きい時
_M 0x30000000 0x00000004 # オフセット0+現在オフセットのアドレスの値が4より小さい時

_M 0xDC000000 0x00000004 # 現在オフセットに+4
#(初回は0x08801004 2回目は0880100Cになる)
_M 0xD6000000 0x00000000 # オフセット0+現在オフセットに値を書き込む。
# その後現在オフセット+4
_M 0xDC000000 0xFFFFFFF8 # 現在オフセット-8

_M 0xD0000000 0x00000000 # 実行ステータス1つ前をロード
_M 0xDC000000 0x00000008 # 現在オフセット+8

_M 0xD2000000 0x00000000 # フルターミネータ
# (ループ終端+ループ終了時レジスタ+オフセットクリア)


_C0 --- 0xD0 * 2 -------
_M 0xD3000000 0x08801000 # オフセットを08801000に設定
_M 0xD5000000 0x11111111 # レジスターに値0x11111111を設定

_M 0xC0000000 0x00000001 # ループ+1回
_M 0x40000000 0x00000001 # オフセット0+現在オフセットのアドレスの値が1より大きい時
_M 0x30000000 0x00000004 # オフセット0+現在オフセットのアドレスの値が4より小さい時

_M 0xDC000000 0x00000004 # 現在オフセットに+4
#(初回は0x08801004 2回目は0880100Cになる)
_M 0xD6000000 0x00000000 # オフセット0+現在オフセットに値を書き込む。
# その後現在オフセット+4
_M 0xDC000000 0xFFFFFFF8 # 現在オフセット-8

_M 0xD0000000 0x00000000 # 実行ステータス1つ前をロード
_M 0xD0000000 0x00000000 # 実行ステータス1つ前をロード

_M 0xDC000000 0x00000008 # 現在オフセット+8

_M 0xD2000000 0x00000000 # フルターミネータ
# (ループ終端+ループ終了時レジスタ+オフセットクリア)
■0xD0 * 1の結果
0x08801000と0x08801008の値を見に来るので
ここに手動で数値を入れる。

0x08801000 0x00000000 # if v>1 then true else false → 0なのでfalse
# if v<4 then true else false → 0なのでtrue

0x08801004 0x00000000 # falseなので書き込まない。
0x08801008 0x00000002 # 1つ前のfalseをロード+2なのでtrue。
0x0880100C 0x00000000 # 既にfalseなのでその後がtureでも実行しない。書き込まない



■0xD0 * 2の結果

0x08801000 0x00000000 # if v>1 then true else false → 0なのでfalse
# if v<4 then true else false → 0なのでtrue

0x08801004 0x00000000 # falseなので書き込まない。
0x08801008 0x00000002 # 2つ前のステータスをロード。初期状態なのでtrue。2なのでtrue。
0x0880100C 0x11111111 # trueなので書き込む。


実行ステータスがスタックされていると考え、
0xD0が多段に並んでいるとその数だけ1つ前に戻ると考える。

ループ+条件判定のコードを組んだ場合
途中で1度でも失敗すると、それ以降のループが実行されないが
適切に0xD0を設定すると、意図したとおりにループが回る。



あと分からないコードタイプは0xC1と0xC4かな。


0xC1は0xC2と違い、アドレスに命令を書き込まないといけない。
引数で直接数値をぶち込めるので、lui oriで数値をセットしなくて良い分
コード行数を若干減らせるのが利点かな?
空きアドレスの管理が不要な0xC2の便利さが若干勝るか。

0xC4は一番謎。
使い方は一応分かったとして、使い道がさっぱり分からん。


■tests.dbより

_C0 Call Function With Arguments Codes (0xC1)
_N 0x08802000 0x00857821 # Expected Result:
_N 0x08802004 0x01E67823 # 0x08802000 = 0x00857821
_N 0x08802008 0x03E00008 # 0x08802004 = 0x01E67823
_N 0x0880200C 0xACEF0000 # 0x08802008 = 0x03E00008
_N 0xC1000004 0x08802000 # 0x0880200C = 0xACEF0000
_N 0x55555555 0x22222222 # 0x08802010 = 0x11111111
_N 0x66666666 0x08802010 #


0x08802000 addu t7, a0, a1
0x08802004 subu t7, t7, a2
0x08802008 jr ra
0x0880200C sw t7, $0000(a3)

0xC1000004 4は引数の個数
0x08802000 実行アドレス

0x55555555 a0=0x55555555
0x22222222 a1=0x22222222
0x66666666 a2=0x66666666
0x08801000 a3=0x08802010

0x08802000 t7=0x55555555+0x22222222=0x77777777
0x08802004 t7=0x77777777-0x66666666=0x11111111
0x08802008 jr ra
0x0880200C sw 0x11111111,(0x08802010)






関連記事
スポンサーサイト

コメント: -

Home > TempAR Usage > TempAR - 0xD0 コードタイプ さんぷる?

Return to page top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。