MIPSアセンブリクイックスタート
ラベル:MIPSアセンブリアセンブリ言語プログラミング言語快速入門転載翻訳原文
MIPSアセンブリクイックスタート
データ型
1.MIPSは固定長命令を使用し、すべての命令は32ビット長の2.1バイト=8ビット、半文字長=2バイト(32ビット)、1ワード長=4バイト3.1文字空間=1バイト4.1個整形=1ワード長=4バイト5.1文字用一重引用符6.文字列用二重引用符
レジスタ MIPSの下には32個の汎用レジスタ がある.アセンブリでは、レジスタフラグは$で始まる レジスタは、2つの方法があることを示す:1.このレジスタに対応する番号は、例えば$0から$31まで直接使用する.対応するレジスタ名、例えばt 1,t 1,spを用いる、詳細は、乗算および除算にそれぞれ対応する2つのレジスタlo,l o,hi を参照する.以上の両者については、直接アドレスは存在せず、mfhi(「move from hi」)とmflo(「move from lo」)のそれぞれで対応するコンテンツにアクセスする必要がある. スタックの方向は、高アドレスから低アドレス に向かう.
MIPSの下の各レジスタ番号と説明
レジスタ番号
レジスタ名
レジスタの用途
0
zero
常に0を返します
1
$at
アセンブリリザーブレジスタ(他の用途では使用できません)
2-3
$v0-$v1
式または関数の戻り値を格納
4-7
$a0-$a3
サブプログラムの最初の4つのパラメータを格納し、サブプログラム呼び出し中に解放する
8-15
$t0-$t7
(temp簡写)一時変数、上呼び出し時に保存しない
16-23
$s0-$s7
(Save or Static略?)静的変数?呼び出し時に保存
24-25
$t8-$t9
(Temp略記)は前の$0-$7の続きであり、属性は$t 0-$t 7と同じである.
26-27
$k0-$k1
(break off略記?)割り込み関数は値を返し、他の用途には使用できません.
28
gp|(GlobalPointer略記)は64 k(gp|(G l o b a l P o i n t e r略記)は64 k(2^{16}$)サイズの静的データブロックの中間アドレスを指す
29
$sp
スタックポインタ
30
$s8/$fp
フレームポインタ
31
$ra
アドレスを返します.他の用途には使用できません.
プログラムこうぞう
本質は、データ宣言+通常テキスト+プログラム符号化(ファイル接尾辞.sまたは.asm)データ宣言がコードセグメントの後(以前でも問題ありません)にあることです.
データ宣言データセグメント以降.dataは開始フラグ であるが変数を宣言すると、すなわち、ホストメモリに空間 が割り当てられる.
コード#コード#コードセグメント以降.textは開始フラグ であるは、実は各命令操作 である.プログラム入門はmain:フラグ プログラム終了フラグ(以下参照) コメント
同C系言語基本テンプレート
データ宣言
宣言の形式:
通常、変数には初期値が付与.space、どのくらいのサイズの空間が必要かを示す必要があります(bytes)
命令セットのロード/保存メモリにアクセスするにはload/store命令 のみが使用可能である.その他はレジスタ動作 のみである.
load
lw
lb
store
sw
sb
load immediate
li
即時および間接アドレス
La(load address直接アドレス)
例えば
かんせつアドレスしてい
アドレスはレジスタの内容(ポインタとも理解できる)
オフセット加算
さんじゅつめいれいセット最大3オペランド のオペランドはレジスタのみであり、アドレス の出現は許されない.すべての命令は32ビット に統一されている.
せいぎょりゅう
ブランチ(if elseシリーズ)
ジャンプ(while,for,gotoシリーズ)
サブルーチン呼び出し
現在のプログラムカウンタを$raに保存し、$raに保存したカウンタを介して呼び出しに戻る前に呼び出したサブプログラムに他のサブプログラムが呼び出されたとして往復すると、戻りアドレスのタグはスタックで格納される.
システム呼び出しと入出力(主にSPIMシミュレータ用)はsyscallを使用し、以下の命令は汎用であるべきである. パラメータで使用されるレジスタ:$v 0,$a 0,$a 1 戻り値使用:$v 0 Service
Code in$v 0対応機能の呼び出しコード
Arguemntsに必要なパラメータ
Results戻り値
1つの整数を印刷
$v0=1
印刷する整数を$a 0に割り当てます.
浮動小数点数を印刷
$v0=2
印刷する浮動小数点数を$f 12に割り当てる
ダブル精度浮動小数点数の印刷
|v0=3
印刷する2精度浮動小数点数を$f 12に割り当てる
文字列の印刷
$v0=4
印刷する文字列のアドレスを$a 0に割り当てます.
整数を読み込む
$v0=5
読み込まれた整数を$v 0に割り当てます.
読み取り浮動小数点数
$v0=6
読み込んだ浮動小数点数を$v 0に割り当てる
二重精度浮動小数点数の読み出し
$v0=7
読み込んだ二重精度浮動小数点数を$v 0に割り当てる
文字列の読み込み
$v0=8
読み出し文字列アドレスを$a 0に割り当て、読み出し文字列の長さを$a 1に割り当てる
sbrk(Cのsbrk()関数と同じ)動的割り当てメモリ
$v0=9
$a 0=amountが割り当てる空間サイズ、単位目視はバイト
割り当てられたスペースヘッダを$a 0に渡す
終了
\v0=10
終了
*印刷された文字列には、.asciizタイプであることを宣言する終端記号(’0’)が必要です.*整数、浮動小数点数、二重精度浮動小数点数などのデータ操作では、行全体が読み出されます.(’’’’で終わる)*文字列を読み取る場合、入力が長すぎると短くなり、短くなっても補完せず、最後に終止符*The sbrk service returns the address to a block of memory containing n additional bytes.This would be used for dynamic memory allocationを加える.
MIPSアセンブリクイックスタート
データ型
1.MIPSは固定長命令を使用し、すべての命令は32ビット長の2.1バイト=8ビット、半文字長=2バイト(32ビット)、1ワード長=4バイト3.1文字空間=1バイト4.1個整形=1ワード長=4バイト5.1文字用一重引用符6.文字列用二重引用符
レジスタ
MIPSの下の各レジスタ番号と説明
レジスタ番号
レジスタ名
レジスタの用途
0
zero
常に0を返します
1
$at
アセンブリリザーブレジスタ(他の用途では使用できません)
2-3
$v0-$v1
式または関数の戻り値を格納
4-7
$a0-$a3
サブプログラムの最初の4つのパラメータを格納し、サブプログラム呼び出し中に解放する
8-15
$t0-$t7
(temp簡写)一時変数、上呼び出し時に保存しない
16-23
$s0-$s7
(Save or Static略?)静的変数?呼び出し時に保存
24-25
$t8-$t9
(Temp略記)は前の$0-$7の続きであり、属性は$t 0-$t 7と同じである.
26-27
$k0-$k1
(break off略記?)割り込み関数は値を返し、他の用途には使用できません.
28
gp|(GlobalPointer略記)は64 k(gp|(G l o b a l P o i n t e r略記)は64 k(2^{16}$)サイズの静的データブロックの中間アドレスを指す
29
$sp
スタックポインタ
30
$s8/$fp
フレームポインタ
31
$ra
アドレスを返します.他の用途には使用できません.
プログラムこうぞう
本質は、データ宣言+通常テキスト+プログラム符号化(ファイル接尾辞.sまたは.asm)データ宣言がコードセグメントの後(以前でも問題ありません)にあることです.
データ宣言
コード#コード#
同C系言語基本テンプレート
# Comment giving name of program and description of function
# ( )
# Template.s
#Bare-bones outline of MIPS assembly language program
.data # variable declarations follow this line
#
# ...
.text # instructions follow this line
#
main: # indicates start of code (first instruction to execute)
#
# ...
# End of program, leave a blank line afterwards to make SPIM happy
# , ?
データ宣言
宣言の形式:
:( )
通常、変数には初期値が付与.space、どのくらいのサイズの空間が必要かを示す必要があります(bytes)
命令セットのロード/保存
load
lw
lw register_destination, RAM_source
メモリからRAMをコピーソースの内容は対応するレジスタに(wはwordを意味し、このデータサイズは4バイト)lb
lb register_destination, RAM_source
同上、lbはload bytestore
sw
sw register_source, RAM_destination
は、指定されたレジスタのデータを特定のメモリに書き込むことを意味するsb
sb register_source, RAM_destination
同lbload immediate
li
li register_destination, value
名前の通り、即時数をロード即時および間接アドレス
La(load address直接アドレス)
例えば
la $to,var1
は、var 1のメモリアドレスを$toに埋め込むことを示すかんせつアドレスしてい
アドレスはレジスタの内容(ポインタとも理解できる)
lw $t2,($t0)
load word at RAM address contained in$t 0 into$t 2 sw $t2,($t0)
store word in register$t 2 into RAM at address contained in$t 0オフセット加算
lw $t2,4($t0)
load word at RAM address ($t0+4) into register $t2,”4” gives offset from address in register $t0 sw $t2,-12($t0)
store word in register $t2 into RAM at address ($t0 - 12),negative offsets are fine さんじゅつめいれいセット
add $t0,$t1,$t2 # $t0 = $t1 + $t2; add as signed (2's complement) integers
sub $t2,$t3,$t4 # $t2 = $t3 Ð $t4
addi $t2,$t3, 5 # $t2 = $t3 + 5; "add immediate" (no sub immediate)
addu $t1,$t6,$t7 # $t1 = $t6 + $t7; add as unsigned integers
subu $t1,$t6,$t7 # $t1 = $t6 + $t7; subtract as unsigned integers
mult $t3,$t4 # multiply 32-bit quantities in $t3 and $t4, and store 64-bit
# result in special registers Lo and Hi: (Hi,Lo) = $t3 * $t4
hi,lo(hi , lo )
div $t5,$t6 # Lo = $t5 / $t6 (integer quotient)
# Hi = $t5 mod $t6 (remainder)
lo, hi
mfhi $t0 # move quantity in special register Hi to $t0: $t0 = Hi
hi lo , mfhi, mflo
mflo $t1 # move quantity in special register Lo to $t1: $t1 = Lo
# used to get at result of product or quotient
move $t2,$t3 # $t2 = $t3
せいぎょりゅう
ブランチ(if elseシリーズ)
b target # unconditional branch to program label target
beq $t0,$t1,target # branch to target if $t0 = $t1
blt $t0,$t1,target # branch to target if $t0 < $t1
ble $t0,$t1,target # branch to target if $t0 <= $t1
bgt $t0,$t1,target # branch to target if $t0 > $t1
bge $t0,$t1,target # branch to target if $t0 >= $t1
bne $t0,$t1,target # branch to target if $t0 <> $t1
ジャンプ(while,for,gotoシリーズ)
j target # unconditional jump to program label target
,
jr $t3 # jump to address contained in $t3 ("jump register")
,
サブルーチン呼び出し
jal sub_label # "jump and link"
現在のプログラムカウンタを$raに保存し、$raに保存したカウンタを介して呼び出しに戻る前に呼び出したサブプログラムに他のサブプログラムが呼び出されたとして往復すると、戻りアドレスのタグはスタックで格納される.
システム呼び出しと入出力(主にSPIMシミュレータ用)
Code in$v 0対応機能の呼び出しコード
Arguemntsに必要なパラメータ
Results戻り値
1つの整数を印刷
$v0=1
印刷する整数を$a 0に割り当てます.
浮動小数点数を印刷
$v0=2
印刷する浮動小数点数を$f 12に割り当てる
ダブル精度浮動小数点数の印刷
|v0=3
印刷する2精度浮動小数点数を$f 12に割り当てる
文字列の印刷
$v0=4
印刷する文字列のアドレスを$a 0に割り当てます.
整数を読み込む
$v0=5
読み込まれた整数を$v 0に割り当てます.
読み取り浮動小数点数
$v0=6
読み込んだ浮動小数点数を$v 0に割り当てる
二重精度浮動小数点数の読み出し
$v0=7
読み込んだ二重精度浮動小数点数を$v 0に割り当てる
文字列の読み込み
$v0=8
読み出し文字列アドレスを$a 0に割り当て、読み出し文字列の長さを$a 1に割り当てる
sbrk(Cのsbrk()関数と同じ)動的割り当てメモリ
$v0=9
$a 0=amountが割り当てる空間サイズ、単位目視はバイト
割り当てられたスペースヘッダを$a 0に渡す
終了
\v0=10
終了
*印刷された文字列には、.asciizタイプであることを宣言する終端記号(’0’)が必要です.*整数、浮動小数点数、二重精度浮動小数点数などのデータ操作では、行全体が読み出されます.(’’’’で終わる)*文字列を読み取る場合、入力が長すぎると短くなり、短くなっても補完せず、最後に終止符*The sbrk service returns the address to a block of memory containing n additional bytes.This would be used for dynamic memory allocationを加える.