Как мне написать MIPS-код для векторного умножения - PullRequest
0 голосов
/ 23 октября 2019

Определить вектор mul(vector v, float t). Он возвращает вектор, умножая его на t.

Если a=4i+3j+12k, то mul(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, регистры не выдают никакого значения. Мой код неверен или мне нужно что-то добавить?

1 Ответ

0 голосов
/ 23 октября 2019
    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 И удалите эти строки прямо перед переходом к ОБНОВЛЕНИЮ.

В противном случае программа умножится только один раз

.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
...