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!
Ä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:
- ta värdet du vill multiplicera från minne/register, säg $t0
- skifta vänster 1 gång och spara i register, säg $t1 (så att $t1=2*$t0)
- skifta vänster 2 gånger till och spara i register, säg $t2 (så att $t2=8*$t0)
- 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.
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
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.