the M.G.C'sHP



記事独立させてみた
当たり前のことしか書かないおっお

レジスタ


lw t0,0x0000(t1)

赤いところがレジスタ

レジスタは一時的に値を保存する箱
32bitまでの数値を入れられる
汎用レジスタといい、全部で32個存在する(fpu専用レジスタは除く)

注意

改造プログラムは通常のプログラムに無理矢理割り込んでいる
通常のプログラムで使われているレジスタの内容を変えてしまうとフリーズ・バグの元になる
なのでできるだけ使われていないレジスタを使うようにする
使用可レジスタが少ないばあいはバックアップを行なうなどして対処

各レジスタ使用用途

v0,v1,a0-a3,t0-t9,s0-s6
汎用レジスタ中で本当に汎用なレジスタ
一応役割があるが気にせず使って構わない

zero
名前の通り常に数値が0x00000000で固定のレジスタ
数値を書き込んでも意味はない
常に0ということで使いかたは様々
例をあげると、
movでレジスタリセット
beq t0,t1,0x0002
nop
mov t0,zero
sw t0,0x0000(s0)


ori(addiu)で即値代入
ori t1,zero,0x0123
sw t1,0x0000(t2)


beqで0との比較
lw t1,t2
beq t1,zero,0x0002
nop
break


などなど

ra
jalを使うとここに戻りアドレスが格納される
なので戻るときjrを使うことで簡単に戻ってこられる
使用例
jal 0x08801000
nop
addiu t1,t1,0x1000 //←ここのアドレスがraレジスタへ保存される

/0x08801000/
lui t0,0x0880
ori t0,t0,0x9200
lw t1,0x0000(t0)
jr ra //raのアドレスへジャンプ


sp
スタックポインタ
レジスタの数値を一時的に退避できるアドレスが書かれている
重要な数値があるかもしれないのでオフセット0x0000付近は使わないこと
sp自体は書き換えてはいけない
sw t1,0x0030(sp) // t1退避
lui t1,0x089C
ori t1,t1,0xABD0
...
lw t1,0x0030(sp) // t1リストア


gp
グローバル変数のベースアドレスが書かれている
使わない方が無難

fp
フレームポインタ
使わない方が無難

k0,k1
I don't know.
OS用らしい
使わない方が無難

参考

専門家の説明
詳しくてわかりやすい

まとめ
簡潔で良い

CopyRight Team-M.G.C Co.,ltd.