mips チュートリアル
mipsを使い始める
サーチ…
備考
このセクションでは、mipsの概要と、なぜ開発者がそれを使いたいのかを概説します。
また、mips内の大きなテーマについても言及し、関連するトピックにリンクする必要があります。 mipsのドキュメンテーションは新しいので、それらの関連トピックの初期バージョンを作成する必要があります。
インストールまたはセットアップ
ミップのセットアップまたはインストールに関する詳細な手順。
QtSpim for windows
- QtSpimをここからダウンロードする 32.6 MB
- 簡単にインストールする
- 最初のアセンブリファイル(.s)を作成するか、サンプルC:¥Program Files(x86)¥QtSpim¥helloworld.sを使用してください
- デスクトップショートカットまたはC:\ Program Files(x86)\ QtSpim \ QtSpim.exeからプログラムを実行します。
(ラベル付きテキスト)、メモリ(ラベル付きデータ)、レジスタの値(浮動小数点のFP Regsと整数のInt Regsというラベルが付けられています)の値が表示されます。シミュレータの制御
コンソールと表示された別のウィンドウは、出力が表示され、プログラムの入力があれば入力します
- ファイル→ロードファイルを使用してファイルをロードする
- クリック実行(f5)を使用して最終結果を確認するか、またはデバッグするプログラムの実行中にレジスタおよびメモリの状態を確認するためにステップバイステップ(p10)に進むことができます
MARS MIPSシミュレータ
MARS MIPSシミュレータは、Missouri State University( src )のPete SandersonとKenneth Vollmarによって開発された、MIPSプロセッサ用のアセンブリ言語エディタ、アセンブラ、シミュレータおよびデバッガです。
あなたはここで自由にMARSを手に入れます 。 4.5バージョンのインストールに関しては、 ここからあなたのシステムに適したJava SDKが必要になるかもしれません
アセンブルする前に、このシミュレーターの環境を単純に3つのセグメントに分割することができます。左上のエディターはすべてのコードが書き込まれ、コンパイラー/出力はエディターの下にあり、 レジスタのリストは "CPU"私たちのプログラムのために。
組み立て後(単にF3を押すだけで)、環境が変化し、2つの新しいセグメントがエディタの位置を取得します。テキストセグメント
i)アセンブリコードの各行は、「基本的な」欄に「擬似命令」をクリアします(これについては秒単位で説明します)。
ii)「コード」列の各命令の機械コード、
リトルエンディアンの順序でプロセッサのメモリの表現を見ることができるデータセグメントです。
組み立て後、コードを一度に(F5)またはステップバイステップ(F7)で実行したり、実行をいくつか後ろに逆戻り(F8)して戻すことができます。
上の例のコードを見て、各行について説明しましょう:
.text
.globl main
main: #main function
li $v0, 11 #11=system code for printing a character, $v0=register that gets the system code for printing as value
la $a0, 'a' #'a'=our example character, $a0=register that accepts the character for printing
syscall #Call to the System to execute our instructions and print the character at the a0 register
li $v0, 10 #11=system code for terminating, $v0=register that gets the system code for terminating (optional, but desirable)
syscall #Call to the System to terminate the execution
MARSは、.asmファイルタイプのファイルを受け入れ、エクスポートします。
しかし、上のコードは文字だけを表示していますが、「Hello World」はどうですか?何か、何もない何かを追加するのはどうですか?さて、私たちがちょうどそれを持っていたものを変更することができます:
.data #data section
str: .asciiz "Hello world\n"
number: .word 256
.text #code section
.globl main
main:
li $v0, 4 #system call for printing strings
la $a0, str #loading our string from data section to the $a0 register
syscall
la $t0, number #loading our number from data section to the $t0 register
lw $s1, 0($t0) #loading our number as a word to another register, $s1
addi $t2, $s1, 8 #adding our number ($s1) with 8 and leaving the sum to register $t2
sw $t2, 0($t0) #storing the sum of register $t2 as a word at the first place of $t0
li $v0, 10 # system call for terminating the execution
syscall
MARSによる結果を説明する前に、これらのコマンドについてもう少し説明する必要があります。
システムコールは、オペレーティングシステムから提供される一連のサービスです。システムコールを使用するには、必要な操作のために$ v0レジスタにコールコードを入れる必要があります。システムコールに引数がある場合、それらは$ a0- $ a2レジスタに置かれます。 ここにはすべてのシステムコールがあります。
li
(即時ロード)は、瞬時にレジスタに値をロードする疑似命令です(これについては後で説明します)。la
(ロードアドレス)は、レジスタにアドレスをロードする擬似命令でもあります。li $v0, 4
、$ v0レジスタは4
として値をとり、la $a0, str
はstr
を$a0
レジスタにロードします。単語は、32ビットシーケンスであり、ビット31が最上位ビットであり、ビット0が最下位ビットである(MIPSについて話しているように)。
lw
(ロード・ワード)はメモリからレジスタに転送され、sw
(ストア・ワード)はレジスタからメモリに転送されます。lw $s1, 0($t0)
コマンドが、我々はにロード$s1
LSBのにあった値登録$t0
レジスタ(何thatsの0
、ここ象徴する言葉のオフセット)、別名256
。$t0
にはアドレスがあり、$s1
には値があります。sw $t2, 0($t0)
は正反対の仕事をします。MARSはリトルエンディアンを使用します。つまり、ワードのLSBがメモリの最小バイトアドレスに格納されます。
MIPSはバイトアドレスを使用するため、アドレスは前と次の4分の1です。
これまでのコードを組み立てることで、メモリとレジスタの交換方法、データセグメントからの「16進値」の無効化をさらに理解することができます。
データセグメントから「ASCII」を有効にする:
このように始める
$ java -jar Mars4_5.jar
このファイルを作成して保存します。
.text
main:
li $s0,0x30
loop:
move $a0,$s0 # copy from s0 to a0
li $v0,11 # syscall with v0 = 11 will print out
syscall # one byte from a0 to the Run I/O window
addi $s0,$s0,3 # what happens if the constant is changed?
li $t0,0x5d
bne $s0,$t0,loop
nop # delay slot filler (just in case)
stop: j stop # loop forever here
nop # delay slot filler (just in case)
F3を押してアセンブリし、次に実行を押します。これで、MIPSコードのコンパイルと実行が開始されました。