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???
Hur tolka MIPS addiu $sp,$sp,-32
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 ^^
konstanten är nämligen signed.
"ALL immediate values should be sign extended."
Håller med om att det var svår tolkad ^^
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.
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.
Senast redigerad av Kaggen 23 mars 2008, 20:11:05, redigerad totalt 1 gång.
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.
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.