Ca laisse donc entendre que SP est ajusté avant que (SP) soit copié dans PC. Donc PC devient SP d'après jsr, pas d'avant.
J'ai écrit ce programme de test :
folco@Foch:~$ cat test.asm include "os.h" xdef _nostub xdef _ti92plus __main: move.w #$4E75,-(sp) ; rts move.w #$4E71,-(sp) ; nop jsr (sp) addq.l #4,sp rts
Le but est d'essayer de faire exécuter la séquence nop // rts sur la pile.
Sur TiEmu, ça marche :
On voit en effet que PC vaut SP+4. Donc PC est modifié avant que SP ne soit décrémenté par jsr, ce qui va à l'encontre du document de Motorola.
Cependant, sur real calc, ça crash, ce qui voudrait dire que le document de Motorola est bien écrit.
ps -> A quoi sert cette technique ? A faire du SMC, mais en exécutant le code modifiant dans la pile, dans un contexte d'exécution en read-only. Ici, toutes mes directives IF* sont identiques, à l'exception du test à réaliser. C'est ce test que je pousse dans la pile :
https://sourceforge.net/p/asoc/code/HEAD/tree/src/directiv.asm#l101 pour le code des directives
https://sourceforge.net/p/asoc/code/HEAD/tree/src/directiv.asm#l178 pour le code commun.
Le workaround, pour utiliser cette technique, est de faire un pea after(pc) // jmp 4(sp) // after:. J'ai pas testé, mais à l'évidence ça devrait marcher.
Hey Kevin, un autre trick pour fooler les désassembleurs de HW4Patch ! \o/