Toon posts:

[C] dup instructie voor stack

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoe maak ik een dup instructie die de bovenste waarde op de stack er nog een keer opzet? iemand? :?

Alvast bedankt!

Verwijderd

pop
push
push

;) Wat wil je eigenlijk doen ?

Verwijderd

Topicstarter
Ik ben heel fijn bezig met een practicum Vertalerbouw, waarbij we een 'eigen' programeertaaltje moeten maken. :)

En nu wilde ik een switch statement toevoegen, maar daar wil ik een dup instructie hebben, zodat ik de waarde waarmee ik de cases vergelijk niet weg is nadat ik 1 keer een eq instructie heb uitgevoerd... Aangezien er standaard geen dup voorhanden is, moet ik die in C nabouwen...

-edit-
Is het trouwens niet zo dat wanneer je een pop instructie doet je die waarde ook kwijt bent? Of kan je die gewoon in een variabele stoppen?

Verwijderd

Topicstarter
Laat maar, ik heb al een andere (omslachtigere) oplossing... maar hij werkt wel! :)

Voor de geinteresseerden: ik maak nu een nieuw segment aan en sla de switch waarde daarin op en iedere keer als ik die waarde wil vergelijken met een case, laad ik die waarde uit dat segment...

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 11:42

Reptile209

- gers -

Of je moet 'm in C even compileren en met debug kijken hoe de compiler het oplost... isse siempel?

Zo scherp als een voetbal!


Verwijderd

Dat is meestal wel een oplossing maar de compiler is vast niet zo slim om zijn (omslachtigere) oplossing netjes over te zetten.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:40

.oisyn

Moderator Devschuur®

Demotivational Speaker

Reptile209 schreef op 06 augustus 2002 @ 16:00:
Of je moet 'm in C even compileren en met debug kijken hoe de compiler het oplost... isse siempel?


ik denk dat hij machinecode moet genereren voor een stack-based virtual machine. Hoe een x86 compiler het doet lijkt me dan niet echt relevant :)

maar je moet idd zoals mgfun aangeeft de waarde van de stack halen met pop, en die vervolgens gewoon 2x pushen
Ik weet niet precies hoe de instructies van jullie virtual machine zijn, maar ik neem aan dat er een vergelijkings instructie is die de bovenste 2 waarden van de stack met elkaar vergelijkt en vervolgens de flags zet?

dit stukje code:
PHP:
1
2
3
4
5
6
7
8
9
10
switch (r)
{
    case 0:
        echo "blaat";
        break;

    case 1:
        echo "woei";
        break;
};


wordt dan zoiets:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    push r
    pop temp
    push temp
    push temp
    push 0
    cmp
    jmpne case1
    push "blaat"
    echo
    jmp endcase

case1:
    pop temp
    push temp
    push temp
    push 1
    cmp
    jmpne endcase
    push "woei"
    echo

endcase:


cmp staat natuurlijk voor compare en jmpne voor jump if not equal, en echo stuurt gewoon output naar het scherm

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Dat is dus het probleem... De pop waarover ik beschikking heb, verwijdert alleen de waarde van de stack maar geeft deze niet terug... heel vervelend...
En wat nog veel vervelender is dat ik niet eens de beschikking heb over een push instructie! :?

Echt heel vaag en het ik heb ook niet echt zin om het uit te leggen. :)
Als je meer wil weten kijk maar op http://fmt.cs.utwente.nl/slade

  • igmar
  • Registratie: April 2000
  • Laatst online: 23-08 16:57

igmar

ISO20022

Verwijderd schreef op 06 augustus 2002 @ 13:30:
Ik ben heel fijn bezig met een practicum Vertalerbouw, waarbij we een 'eigen' programeertaaltje moeten maken. :)

En nu wilde ik een switch statement toevoegen, maar daar wil ik een dup instructie hebben, zodat ik de waarde waarmee ik de cases vergelijk niet weg is nadat ik 1 keer een eq instructie heb uitgevoerd... Aangezien er standaard geen dup voorhanden is, moet ik die in C nabouwen...

-edit-
Is het trouwens niet zo dat wanneer je een pop instructie doet je die waarde ook kwijt bent? Of kan je die gewoon in een variabele stoppen?
Is het niet veel handiger om een stack te schrijven in C ?? Ik weet de opdracht niet, wij moesten toendertijd een virtuele programmeertaal parsen en daar een exe van bakken die wat deed. Ik deed dat door gewoon C te genereren en die door cc te gooien :)

Machinetaal zou ik zoveel mogelijk vermijden als het kan, en gewoon in C oplossen. Stacks doe ik altijd met een linked list, en 2 wrapper functies.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:40

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 07 augustus 2002 @ 11:42:
Dat is dus het probleem... De pop waarover ik beschikking heb, verwijdert alleen de waarde van de stack maar geeft deze niet terug... heel vervelend...
En wat nog veel vervelender is dat ik niet eens de beschikking heb over een push instructie! :?

Echt heel vaag en het ik heb ook niet echt zin om het uit te leggen. :)
Als je meer wil weten kijk maar op http://fmt.cs.utwente.nl/slade


zo te zien kun je met ldcon, ldind en ldvar respectievelijk constanten, geheugen en variabelen op de stack pushen

het is idd loos dat er geen dup instructie is... maar dat kun je wel oplossen met stvar en ldvar:
code:
1
2
3
ldvar temp
stvar temp
stvar temp

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1