2016-09-03 16 views
1

これは初めてのアセンブリプログラムの作成です。最初の2つのユーザー入力と合計を格納する$ t0、$ t1、$ t2を使用して基本的な追加プログラムを作成するはずです。私のユーザー入力が常に5として保存されている理由を理解できません。MIPS - 簡易加算 - 一時レジスタを使用した記憶域の入力

私のシステムコールに問題がありますか?

.data 
prompt1: .asciiz "Give me an integer number: " 
debug1: .asciiz "The first number inputted was: " 
debug2: .asciiz "The second number inputted was: " 
prompt2: .asciiz "\nGive me another integer number: " 
result: .asciiz "\nThe sum of the two inputted numbers is: " 

.text 

li $v0, 4 #System call to print a string 
la $a0, prompt1 #load prompt1 into address 0 - Give me an integer 
syscall 

#store first input in $t0 
li $v0, 5 #System call code for Read Integer from input 
move $t0, $v0 #Move value from $v0 to $t0 
syscall 

#print the First user input for debugging --> Always prints 5 

li $v0, 4 #System call code for Print String 
la $a0, debug1 #Print debug1 string 
syscall 

li $v0, 1 #print int 
move $a0, $t0 #move value in $t0 to $a0 
syscall 

#call prompt 2 
li $v0, 4 #Print a string 
la $a0, prompt2 # Here is the value to print - "Give me another integer" 
syscall 

#store second input in $t1 
li $v0, 5 #System call code for Read Integer from input 
move $t1, $v0 # $t1 = value from input 
syscall 

#print the second int input for debugging --> Always prints 5 

li $v0, 4 #System call code for Print String 
la $a0, debug2 #Print debug2 string 
syscall 

li $v0, 1 #System call code for Print Int 
move $a0, $t1 #move value in $t1 to $a0 
syscall 

#add numbers 
add $t2, $t1, $t0 # $t2 = $t1+$t0 

li $v0, 4 #System call to Print String 
la $a0, result #Print the string result 
syscall 

li $v0, 1 #System call to Print Int 
move $a0, $t2 #Move $t2, which = $t1 + $t0, into $a0 
syscall 

私は事前に助けていただきありがとうございます。

#store second input in $t1 
li $v0, 5 #System call code for Read Integer from input 
syscall 
move $t1, $v0 # $t1 = value from input 

行の後にシステムコールを持っている、とない移動行の後にすべき -

+0

デバッガでどの値がレジスタに入っているか確認しましたか?読まれたシステムコールの戻り値が期待どおりであることを確認し、それが後のコードの正しい場所に終わることを確認することができます。 (私は多くのMIPSを知らず、何か間違っていることに気づいていませんでした) –

+1

ちょっと@PeterCordesはい、$ t0と$ t1レジスタは常に値5を返しています。 「Get Int From Input」のコードが5であるという事実に従ってください。別名「li $ v0、5」。ですから、なぜ$ v0は入力によって上書きされないのですか? – zomp

答えて

1

は問題が見つかりました。そうでなければ、$ v0の値を変更するのをユーザー入力が待つことなく、$ v0の値が$ t0に移動します。これは5です。 move行の後にsyscallがある場合、プログラムはユーザー入力に基づいて別のサービス呼び出しを実行します。ここのコメントをもっと見る:Service Calls Executing Based on User Input

1

mips と$t1は一時レジスタです。その呼び出し規約によれば、呼び出し後に一時的なレジスタの内容について何も仮定することはできません。したがって、システムコールで特に指定しないかぎり、一時レジスタを上書きすると仮定する必要があります。代わりに$s0 ... $s7レジスタを使用して保存する必要があります。

編集:ああ、あなたの指示に間違いがあります。また、一時的なレジスタの制限を覚えておいてください。

+1

システムコール呼び出し規則は、通常、関数呼び出し呼び出し規則とは異なります。例えばLinuxでは、カーネルスタックにアクセスできないため、 'syscall'命令は常にrcxとr11(RIPとRFLAGSの戻り値を保持する)を破壊するx86-64のようないくつかのアーキテクチャでは、システムコールはすべてのレジスタを保持する*まだ命令を作成することなく、それらを保存するための記憶はありません。 –

+1

@PeterCordes興味深いですが、これはどのカーネルでも仮定できる不変量ですか?組み込みシステムのシステムコールが '$ t'レジスタを踏みにじると驚くことはありませんが、' $ s'を踏みにじると驚いてしまいます。多分この直感は誤りです。 –

+2

カーネルは自由に何でもできますので、チェックしないと仮定できません。 ABIのデザイナーがあなたの直感であなたの気持ちをわかりやすく聞き取ることができます。私が推測を余儀なくされ、ドキュメントをチェックすることが許可されていない場合、私は防衛的にコーディングを行い、システムコールが標準のMIPS規約によって一時的と見なされる規制を覆い隠していると想定します。しかし、私は彼らがSPIMのシステムコールABI(またはこれが何であれ)に巻き込まれていない可能性が高いと思います。 –

関連する問題