questionable1 är nöjd med hjälpen
questionable1 180 – Fd. Medlem
Postad: 1 aug 2018 10:40

Multiplikation mha MIPS kommandon

Hej,

Jag försöker att skriva en kod till följande problem mha MIPS kommandon men förstår inte riktigt vad jag ska göra med 10an. 

10*($a0+4)

Här har ni mitt försök (vilket jag tror inte stämmer)

addi $t0, $a0, 2          #$a0+4 , sparat i registret $t0
li $t1, $t1, 3                # 3 = 2^3 =8 , sparat i registret $t1 , li= load immediate
li $t2, $t2, 1                # 1 = 2^1 =2 , sparat i registret $t2 , li= load immediate
addi $t3, $t2, $t1      # 8+2 =10 , sparat i registret $t3
sll $v0, t3, $t0            # 10*($a0+4) , sparat i registret $v0 

Någon som kan se om koden stämmer (känns inte så iaf.)
Tack på förhand! 

Lindehaven 820 – Lärare
Postad: 1 aug 2018 12:13 Redigerad: 1 aug 2018 12:40

Är det någon speciell anledning till att du inte använder MULT?

Ska du alltid multiplicera med 10 och inte använda MULT så är du någorlunda på rätt väg. Metoden är:

  1. ta värdet du vill multiplicera från minne/register, säg $t0
  2. skifta vänster 1 gång och spara i register, säg $t1 (så att $t1=2*$t0)
  3. skifta vänster 2 gånger till och spara i register, säg $t2 (så att $t2=8*$t0)
  4. addera värdena, dvs $t1+$t2, och spara i minne/register, säg $v0 (så att $v0=2*$t0+8*$t0=10*$t0)

Är LI verkligen en av MIPS opcodes? Provade din kod på https://rivoire.cs.sonoma.edu/cs351/wemips/ och den svarar "Unknown instruction: LI". Vad svarar din MIPS assembler?

Tror inte att du vill använda din sista kodrad för då riskerar du att skifta vänster alldeles för många gånger. Anledningen är:

SLL skiftar bitarna i $t3 "vänster" vilket görs $t0 gånger och resultatet läggs i $v0. För varje skift vänster så dubbleras värdet av $t3, det blir m a o inte en multiplikation med $t0 utan en multiplikation med 2^$t0. Den högsta biten som skiftas ut kastas bort så om det är en 1:a som skiftas ut så blir resultatet felaktigt. $t0 får inte vara större än 31 för då blir resultatet också felaktigt.

questionable1 180 – Fd. Medlem
Postad: 1 aug 2018 16:48

Hej,

Tack för hjälpen! Jag gav det ett försök och fick detta nu

addi $a0, $a0, 4  
sll  $a0, $a0, 1  
sll  $t0, $a0, 2  
add  $v0, $t0, $a0

Lindehaven 820 – Lärare
Postad: 1 aug 2018 17:06

Bra, den multiplicerar 4 med 10!

Men notera att 4 adderas till $a0 på första raden varje gång instruktionerna exekverar. Så om ingen annan instruktion nollställer $a0 så kommer värdet att öka vid varje exekvering. Om du vill få samma resultat varje gång så behöver du tilldela värdet 4 varje gång, t ex så här:

addi $a0, $zero, 4

Överkurs: Om detta ska vara mer flexibelt så bör in-parametern $a0 tilldelas från en minnes-adress istället. Då kan koden länkas ihop med annan kod - även kod skriven i andra språk än MIPS assembly.

Svara Avbryt
Close