1

定义向量mul(vector v, float t)。它通过将向量乘以 t 返回一个向量。

如果a=4i+3j+12kthenmul(a,0.5)将返回2i+1.5j+6k

这是我写的代码:

.globl main
.text

main:
    la $s0,t                 #loading t into s1
    lw $s1,0($s0)             
    ori $s2,$zero,0     
    la $s3,v
    #la $s0,v
    #lw $s3,0($s0)
    la $s0,s
    lw $s4,0($s0)
    jal f

f:
    #if <cond>
    bge $s2,$s4,DONE
    #<for body>
    lw $s5, 0($s3)
    mul $s3,$s3,$s1 
    li $v0,10
    syscall
    j UPDATE

UPDATE:
    addi $s2,$s2,1    #i=i+1
    addi $s3,$s3,4    #moving address 4 bytes since int
    j f

DONE:

    li $v0,10
    syscall
    .data
    s: .word 3
    v: .word 4 3 12         #hard coding vector coefficients
    t: .word 2              #value to be multiplied by

当我在 SPIM 模拟器上运行它时,寄存器不会产生任何值。我的代码是错误的还是我需要添加一些东西?

4

1 回答 1

0
    mul $s3,$s3,$s1 : this instruction is wrong because $s3 register contains the address of the vector and no the value .

li $v0,10 ; syscall并在跳转到 UPDATE 之前删除这些行。

否则,一个程序只会乘以一次。

.data
  s: .word 3
  v: .word 14 3 12         #hard coding vector coefficients
  t: .word 2              #value to be multiplied by

.globl main
.text

main:
  la $s0,t                 #loading t into $s0
   lw $s1,0($s0)             # $s1=2          
   ori $s2,$zero,0           # $s2=0
   la $s3,v                 # loading v into $s3
   li $s7,0

   la $s0,s                 # loading s into $s0
  lw $s4,0($s0)           # $s4 = 3
  j f

 f:
  #if <cond>
  bge $s2,$s4,DONE        
  #<for body>
  lw $s5, ($s3)            # $s5= 4
  mulu $s5,$s5,$s1 
  addu $s7,$s7,$s5         # result stored into $s7

 j UPDATE

UPDATE:
  addiu $s2,$s2,1    #i=i+1
  addiu $s3,$s3,4    #moving address 4 bytes since int
  j f

DONE:

  li $v0,10
  syscall
于 2019-10-23T18:14:45.473 回答