2

MIPS アセンブリ (つまり、あらゆる種類のアセンブリ) を扱うのはこれが 2 回目なので、お手柔らかにお願いします。そこで、MIPS の乗算関数をゼロから作成しました。思ったより簡単でした。テストしたところ、1 つの値に対して完全に機能しました。残念ながら、配列が登場すると、私は完全に失われます。

どうやって始めればいいのかもわかりません。大きな考えを理解していないので具体的な質問をすることができないので、私は遅れを感じます. スペースを割り当て、配列に定数値を設定しましたが、次の方法がわかりません。

A.) 定数値 (5、2、3、10、7 など) を配列にロードします。

B.) 外側のループを開始します。

私のコードは以下にあり、必要なのは外側のループを実行する方法だけです。何か案は??

/*
Name: MrPickl3
Date: October 10, 2013
Purpose:  Program creates a multiply function from scratch.  Uses two arrays to
      test the program.
*/

#include <xc.h>

. data

X: .space 80
Y: .space 80
N: .space 4
MAC_ACC .word 0x00000000

    .text
    .globl main

main:
    li t0, 0x00000000 //i = 0
    li t1, 0x00000005 //Offset of array
    li t2, MAC_ACC //Mac_acc (i.e. product register)
    lw t9, 0(t2) //Refers to MAC_ACC's data
    la t3, X //Address of X[0]
    lw t4, 0(t3) //Data of X
    la t5, Y //Address of Y[0]
    lw t6, 0(t5) //Data of Y

loop:
    addiu t0, t0, 4 //i++

//t4 = x[i]
//t6 = y[i]
//t7 = counter

mult:
    beq  t6, 0, loop  //Check if y = 0.  Go to loop, if so.
    andi t7, t6, 1    /*We want to know the nearest power of two.
                      We can mask the last bit to
                      test whether or not there is a power of two
                      left in the multiplier.*/
    beq  t7, 0, shift //If last bit is zero, shift
    addu t9, t9, t4   //Add multiplicand to product

shift:
    sll t3, t3, 1 //Multiply x[i] by 2
    srl t4, t4, 1 //Multiply y[i] by 2

lab2_done:
    j lab2_done
    nop

.end main

X_INPUT: .word 5,2,3,10,7
Y_INPUT: .word 6,0,8,1,2
N_INPUT: .word 5
4

1 に答える 1

1

表示されている構文がlw $t4, 0($t3). で次の単語を取得できることは既にご存じだと思いますがlw $t4, 4($t3)、そのインデックスを動的にする方法に行き詰まっています。

秘訣は、即値 (0、4、8 など) を変更しないことです。代わりに、上記の例で配列の最初のワードを指すレジスタの内容を変更します。

これは、配列のメンバーをゼロに初期化する単純な do-while ループを実装するために、CompArch クラスの割り当て用に作成したコードです。$s0 には、配列の最初の単語のアドレスが読み込まれていることがわかります。

必要な要素へのオフセットを取得し、4 を掛けて (左に 2 回シフト)、そのオフセットを $s0 (最初の単語) に追加します。ここで、$t1 は設定したい int を指します。$t1 が指すアドレスに値 ($zero) を格納するだけです。

        .text 
partC:  # Implement a do-while loop (0-100)
        add $t0, $zero, $zero # i=0
Cstart: # Get offset to current int
        sll $t1, $t0, 2  # *4
        add $t1, $s0, $zero
        sw $zero, ($t1)
        add $t0, $t0, 1  # i++
        blt $t0, 100, Cstart # i < 100
Cdone:  add $v0, $zero, 10 # terminate program
        syscall 

構文sw $zero, ($t1)は単なる疑似操作であることに注意してくださいsw $zero, 0($t1)

これが基本的な概念に役立つことを願っています!

于 2013-10-11T18:49:31.177 に答える