17Fermer19
BrunniLe 01/04/2012 à 22:48
Zerosquare (./5) :
Sous Windows c'est facile : l'espace d'adressage du processeur est virtuel, donc tu peux avoir des adresses hardcodées pour les variables, même si en RAM physique l'adresse peut être complètement différente d'une exécution à l'autre (note : c'est pas toujours vrai pour les DLL, y'a une adresse de base mais il peut y avoir des relogements, si y'a plusieurs DLLs qui veulent utiliser le même adresse mémoire par exemple).

C'est un souci de sécurité, d'ailleurs maintenant avec la protection (ça a un nom du style base address randomization) je crois que ce genre de programme ne peut plus marcher...
Après c'est pas dit que les jeux l'activent, surtout s'ils peuvent gagner des perfs en ne le faisant pas wink
Folco (./7) :
Brunni (./3) :
Dernière chose, comme ces valeurs ne sont jamais stockées sur la pile (elles doivent persister toute la partie)

Et pourquoi ? main() peut très bien utiliser un stack frame. smile

On peut, mais perso j'ai presque toujours vu les variables allouées dans une zone de mémoire fixée à l'avance (et je faisais pareil, sur ARM ça valait le coup en tous cas, sans parler de la vieille GB et ses 3 registres 16 bits*), et la pile était cantonnée à une taille minimum. Et puis ton stack frame si on parle bien de la même chose ça monopolise un registre non ? Après c'est possible que des jeux qui ont plein de gameplays différents le fassent**, mais en tant que joueur j'ai dû tomber une ou deux fois dessus seulement (ça veut dire qu'il faut penser à dynamiquement activer les codes quand tu es dans la phase "jeu", sinon ça faisait planter les special stages par exemple).

* On avait 6 registres 8 bits vraiment "user" (B, C, D, E, H, L), en plus de l'accu (A), le SP et le PC (16 bits) avec lesquels on pouvait pas vraiment jouer car des instructions s'en servent, et on pouvait combiner les registres 8 bits pour faire BC, DE, HL cette fois 16 bits.
** Même si on n'est pas obligé, en ASM c'est facile de réutiliser des adresses mémoire selon le besoin, et en C on pouvait réutiliser un gros tableau du main gameplay pour y stocker autre chose avec une union par exemple.



darkpig (./15) :
Dans Aladdin le nombre de vies n'est pas dans sa vraie valeur, il va de 48 (0) à 57 (9)... confus Déjà je me demande pourquoi, mais en tout cas je ne trouve pas non plus quoi que ce soit qui semble définir ou agir sur cette valeur. :\

C'est de l'ASCII. Ca veut dire que tu n'as probablement pas trouvé l'adresse qui stocke réellement le nombre de vies, mais plutôt celle qui est utilisée pour construire la chaîne à afficher à l'écran. Exemple 03 -> '0' (48) '3' (51) si on veut l'afficher avec une fonction de haut niveau.
Tu as aussi souvent des valeurs stockées en BCD. Ca veut dire 4 bits par chiffre. Par exemple 18 = 0001 1000 en binaire = 24.

Concernant le fait de trouver les instructions référençant une zone mémoire, c'est difficile car rien n'empêche à un programme de charger dans un registre l'adresse de base et de faire un move indexé, style:
move.b #0xff00, a0  ; Variables utilisateur stockées à partir de 0xff00, vies à 0xff04
...
move.b #3, #4(a0)   ; 3 vies

Je sais plus la syntaxe en 68000 mais tu vois l'idée.