Hur tolka MIPS addiu $sp,$sp,-32

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
arte
Inlägg: 317
Blev medlem: 13 januari 2006, 01:18:50

Hur tolka MIPS addiu $sp,$sp,-32

Inlägg 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???
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg 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 ^^
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg 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.
Senast redigerad av Kaggen 23 mars 2008, 20:11:05, redigerad totalt 1 gång.
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg 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)
arte
Inlägg: 317
Blev medlem: 13 januari 2006, 01:18:50

Inlägg 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.
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg 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 ^^
Skriv svar