Sida 1 av 1
Hur tolka MIPS addiu $sp,$sp,-32
Postat: 23 mars 2008, 18:35:50
av arte
Hej,
Jag undrar hur man skall tolka denna MIPS instruktion:
addiu $sp,$sp,-32
addiu = add immediate UNSIGNED
sp= stack point
Att den ökar stackpekaren med 32 råder det inga tvivel om. Problemet är att den lägger till -32 medans instruktionen är ju en UNSIGNED instruktion.
-32 blir altså 65504.
Då kommer den väl att lägga till 65504 på SP???
Postat: 23 mars 2008, 19:36:27
av exile
Nja, inte helt rätt
konstanten är nämligen signed.
"
ALL immediate values should be sign extended."
Håller med om att det var svår tolkad ^^
Postat: 23 mars 2008, 19:43:13
av Kaggen
Ah, Det är detta som är det roliga med digitalteknik och att skyffla bitar. Iomed att du skriver 65504 antar jag att SP är ett 16-bitars register, men det spelar igentligen ingen roll. -32 omvandlar assemblern som du säger till 65504 men iomed att registret är max 16-bitar så wrappar det runt vid 65536. D.v.s att 65536 blir 0 igen (iomed att det finns ingen 17:e bit som isåfall skulle sättas vid 65536).
Så om du har värdet 100 och lägger till 65504 så blir resultatet i ett 16-bits register 68.
Antagligen sparar du (eller orginalkodaren) in någon klockcykel att använda unsigned adition istället för signed subtraktion. Du kan ju kolla om du har nåt datablad.
Det kan ju tyckas löjligt att spara in en klockcykel här eller där, men beroende om koden ligger i en innerloop som exekveras några tusen ggr per sekund så kan det göra stor skillnad.
Edit: Oops! skrev "32-bitars register" men menade 16, fast enligt exile nedan så är det alltså ett 32-bitars signed extended, borde ändå bli samma resultat.
Postat: 23 mars 2008, 19:50:36
av exile
Nja, konstanten är max 16bitar men registret är 32bitar så "mipsen" "sign extended" (devis sätter alla bitar 31-16 till 1 om bit 15 == 1)
Postat: 25 mars 2008, 13:22:05
av arte
Tack för svar!
Ifall konstanten ändå är signed så förstår jag inte skillnaden mellan addi och addiu.
Eftersom man "omvandlar" konstanten till en 32 bitars signed så borde det väl inte spela någon roll. (på add non-immediate gör det inte det).
Har testat lite med PCSpim och kan inte få någon skillnad hur jag än gör.
Postat: 25 mars 2008, 14:43:26
av exile
addi genererar en "trap" signal (interupt) vid overflow vilket inte addiu gör..
Hur man använder "traps" har jag ingen större koll på, jag vet bara på ett ungefär hur de tänkts att används, Och namnet på instruktionen är verkligen förvillande....
hoppas gav några svar ^^