2017-03-01 4 views
0

私は私の学校のコンピューターアセンブリと組織クラスに所属しています。私は理解できないMIPS MARSのコードを持っています。教師は本を教えていないので、MIPS MARSでこれをコーディングする方法を知る方法はありません。 $ sのレジスタに初期値を代入する方法を理解していますが、if文のコーディング方法や見た目の見栄えが分かりません。私の人生を救うためにこの先生から学ぶことができないので、どんな助けもありがたいです。 MIPSアセンブリ言語で次のコードを記述することになっています。Mips Marsブレッチングステートメント

1)MARSアセンブラを使用して、次の高レベルJava文をMIPSアセンブリコードに変換しますか? (60点) 次の分岐文を記述します。 a = 10、b = 16、c = 16、d = 6、aには$ s0、bには$ s1などを使用します。

if(a==b){ 
     Z = a+a; 
     Z=Z+b+c+d; 
    } 

    if(a==b){ 
     Z=a; 
     Else{ 
      Z = (a+b+c)-d; 
     } 

    if (a != b){ 
    Z=a; 
    Else{ 
     Z = (a+b+c)-d; 
    } 
  • 移動1~10倍のループを介して、ループカウンタを書き出します。
  • ループを使用して10個の数値の合計を計算します。結果を書き出します。
  • +1

    MARSでは、エディタが私に可能な指示についてのヒントを教えてくれます。すべての条件分岐は 'b'で始まります。ヒントから実際に何をやっているのか分からない場合は、特定の命令をGoogleに試してください(ほとんどの分岐命令は疑似命令です)。 1つの警告は、アセンブル条件付き分岐を検索し、異なるCPUについての説明がある場合、「フラグ」のようなものについて話すかもしれません。 MIPSにはそのようなものはありません.MIPS分岐は常に分岐命令の引数として提供される値に基づいているため、MIPSのみを検索してください。 – Ped7g

    +1

    MIPSには、分岐を避けるための命令もあります。たとえば、最初の引数が2番目の引数よりも小さい場合は、 'slt'はデスティネーションを' 1 'に設定します。あなたのタスクでは、これらはあまり役に立たないでしょうが、時には分岐を伴わずに '0/1'を持つことは、望みの結果を計算するのに十分です。 – Ped7g

    答えて

    1

    あなたの質問は具体的ではないので、ここでif statementの書き方を尋ねるのは、ユーザー入力から2つの整数の大きい方を出力するコード例です。私はif statementがどこから始まり、あなたがMARSでそれを走らせることができるかをコメントしました。

    .text 
    
    
    .data 
    message: .asciiz " Enter a number\n" 
    message2: .asciiz "Enter another number\n" 
    main: 
    .text 
    
    la $a0, message  #print out message 
    li $v0, 4 
    syscall 
    
    
    li $v0, 5  # read user input (integer) 
    syscall 
    
    move $t0,$v0   # t0 = user input number 1 
    
    la $a0, message2  #print out message2 
    li $v0,4 
    syscall 
    
    li $v0, 5   #read user input 
    syscall 
    
    move $t1,$v0  # t1 = user input number 2 
    #******************************************** 
    # if statement begins her 
    #*************************************** 
    bgt $t0,$t1, bigger # branch to bigger if t0 > t1 
    move $t2,$t1   # t2 = t1 
    b endif    
    bigger: 
    move $t2,$t0   # t2 = t0 
    endif: 
    # ************************************ 
    # if finish here 
    #************************************ 
    move $a0,$t2   # move the result in the argument a0 
    li $v0, 1    # print it out 
    syscall 
    
    li $v0,10 
    syscall 
    

    彼女もif statement

    branch $a0,$a1, lable #in case you use `beq` means (if a0 ==a1 jump to lable) 
    #branch to lable if condition is met 
    #if body 
    b endif 
    lable: 
    #if body 
    
    endif: 
    

    のための擬似コードの詳細にそれを説明するために、あなたの最初のif statementを変換してみましょうです。

    if(a==b){ 
         Z = a+a; 
         Z=Z+b+c+d; 
    
    
    
        beq $s0,$s1,L 
        add $t0,$0,$s0 
        add $t1,$t0,$s1 
        add $t2,$s2,$s3 
        add $t0,$t1,$t2 
        b endif 
    L: 
    
    endif: