2010-05-20 7 views
1

quelqu'un peut-il s'il vous plaît expliquer ce que ce programme est en train de faire?programme sur l'Assemblée

.= torg + 1000 

main: 
     mov pc, sp 
     tst –(sp) 

     mov #list1, -(sp) 
     jsr pc, mystery 
     mov r0, res1 
     tst (sp)+ 

     mov #list2, -(sp) 
     jsr pc, mystery 
     mov r0, res2 
     tst (sp)+ 

     halt 


mystery: 
     mov r1, -(sp) 
     mov r4, -(sp) 
     mov r5, -(sp) 

     clr r0 

     mov 10(sp), r4 
     mov r4, r5 

loop: 
     mov r4, r1 
     jsr pc, next 
     mov r1, r4 
     beq return 

     mov r5, r1 
     jsr pc, next 
     jsr pc, next 
     mov r1, r5 
     beq return 

     cmp r4, r5 
     beq setret 
     br loop 

setret: 
     inc r0 

return: 
     mov (sp)+, r5 
     mov (sp)+, r4 
     mov (sp)+, r1 
     rts pc 


next: 
     tst r1 
     beq abort 
     mov (r1), r1 
abort: 
     rts pc 


.= torg + 3000 
list1: .word 3006, 3000, 3002, 3004, 0 
res1: .word -1 

.= torg + 3020 
list2: .word 3030, 3026, 0, 3024, 3022 
res2: .word -1 

Je ne comprends pas cet extrait, merci d'avance pour tout le monde

mystery: 
      mov r1, -(sp) 
      mov r4, -(sp) 
      mov r5, -(sp) 

      clr r0 

      mov 10(sp), r4 
      mov r4, r5 

Répondre

0

Il semble sauvegarder les registres 1, 4 et 5 et 0 registre d'initialisation (qui n'a pas besoin être sauvegardé). Depuis @mystery est la destination d'un jsr, cela s'appelle prologue code. Ensuite, ils sont initialisés pour la boucle.

Les anciennes valeurs sont restaurées à @return. En ce qui concerne l'ensemble du programme, il semble trouver des liens cycliques dans une liste chaînée. Je ne pense pas que ce soit le moyen le plus simple ou le meilleur pour implémenter cela, mais pas le pire non plus.

+0

expliquer s'il vous plaît dans cette rangée mov # list1, - (sp) puis-je envoyer un pointeur vers list1 ou toutes les valeurs de list1? – lego69

+0

@lego: juste le pointeur, c'est-à-dire la valeur de l'étiquette 'list1'. Pour le processeur, c'est juste un nombre comme un autre. – Potatoswatter

+0

et une question: pourquoi avons-nous besoin de lignes r1 mov, - (sp) mov r4, - (sp) mov r5, - (sp) nous n'avons pas utilisé ces registres – lego69

0
 mov r1, -(sp) 
     mov r4, -(sp) 
     mov r5, -(sp) 

Ceci pousse les trois registres sur la pile.

 clr r0 

Évident.

 mov 10(sp), r4 
     mov r4, r5 

Ceci extrait un paramètre de la pile dans r4 (puis le copie dans r5).

+0

Pouvez-vous expliquer s'il vous plaît, ce que ce programme fait? – lego69

+0

et comment ce mov 10 (sp), r4 fonctionne? – lego69

+0

@ lego69: il charge le mot d'un décalage de 10 de (sp) en r4. Ce sera 5 mots dans la pile, et puisque nous avons juste poussé trois mots sur la pile, c'est le deuxième paramètre qui a été passé. –