2016-06-19 4 views
1

Je code dans 8086 assembleur et j'ai rencontré une question intéressante. Le sujet est d'évaluer les parenthèses. Si c'était une question dans Java ou C, je définirais simplement deux piles - une pour les nombres, et une autre pour les opérandes. Puis-je faire quelque chose de similaire dans Assembly? Pour autant que je sache, la pile est définie dans les dernières cellules de mémoire du segment de données. Si je définis un autre segment de données, aurais-je une autre pile utilisable?Deux piles dans l'assembleur?

Une autre info: Je ne connais pas la taille d'entrée au début et je suis censé rendre le programme aussi efficace que possible.

Merci!

Répondre

2

Pour autant que je sache, la pile est difined dans les dernières cellules de mémoire du segment de données

Cela est vrai si vous développez un programme de style .COM où tous les registres de segment ont la même valeur et où DOS a placé le stackpointer à l'extrémité supérieure de cette mémoire de 64 Ko.

Si je vais difiner un autre segment de données, aurai-je une autre pile utilisable?

Il n'y a pas besoin de changer le données Segment d'avoir une autre pile. Changez la paire de registres SS: SP et commencez à utiliser la pile nouvellement définie. L'empilement s'étend vers le bas à partir de SP. Donc si vous aviez SP = 4096 alors la pile serait de 4096 octets. (sans compter l'enroulement qui serait probablement faux de toute façon)

+0

Merci. Que cela devrait fonctionner? pile 100h poussoir pousser bx ... hache mov, ss mov bx, sp mov ss, 0f00h mov sp, 0f00h Et que j'ai une pile dans la hache: bx et une autre pile dans ss: sp? – DoronZor

+0

Il ne peut y avoir qu'une seule pile active à la fois: celle définie avec SS: SP. Vous pouvez configurer une deuxième zone de mémoire à des fins d'empilage, mais vous devez charger le pointeur complet sur cette région dans la paire SS: SP. –

+0

Également une instruction comme 'mov ss, 0f00h' n'existe pas! Vous ne pouvez pas déplacer une valeur immédiate (nombre) dans un registre de segment. –

0

Donc vous voulez utiliser deux stack data structures pour évaluer des expressions comme ((a+b) + (c))?

Vous pouvez utiliser le call stack (sp) pour l'un d'entre eux, si vous êtes attentif à vérifier que les erreurs de syntaxe dans l'entrée ne plantent pas votre programme. (Par exemple, comparez bp avec sp pour détecter quand vous avez vidé la structure de données de la pile que vous stockez dans la pile d'appels).

Ne modifiez pas sp pour pointer vers l'autre structure de données de la pile; utiliser un registre différent (comme si) pour y accéder.

Vous pouvez utiliser lodsw pour apparaître dans ax (avec le drapeau de direction défini de manière appropriée pour la direction de croissance de votre pile). Ou utilisez stosw pour pousser l'axe sur une pile pointée par di. Mais comme ils utilisent des registres d'index différents, cela n'en vaut pas la peine (surtout ne pas changer le drapeau de direction tout le temps). Donc, pour la structure de données de la deuxième pile, utilisez simplement mov charges/magasins et add/subb si, 2 selon le cas.

S'il s'avère incommode de conserver l'une des piles sur la pile d'appel (sp), ne le faites pas non plus.