Fermer2
deleted2Le 25/11/2014 à 12:32
68kPM.pdf dit ça, page 83 : JSR <ea> : SP – 4 → SP; PC → (SP); Destination → PC
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 : eftu
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/