La décompilation de Ravenloft : Strahd's possession

Le DOS n'est prévu que pour gérer 1Mo de mémoire, or les pointeurs d'adresses ne font que 16bits (2 octets) donc il ne peuvent adresser que 65535 octets de la mémoire, soit 64Ko. C'est là qu'intervient le segment pour pouvoir agrandir l'espace adressable.

[caption]Format d'une adresse dans une mémoire segmentée[/caption]
Segment   Offset
0x0000 : 0x0000

L'offset devient donc une position relative à son segment. Comme on a vu précédemment la technique pour récupérer une adresse absolue étant :

Adresse = (Segment << 4) + Offset

Chaque segment couvrant donc 64Ko de mémoire. Dès lors on serait tenté de penser qu'il n'y a que 16 segments (1024 / 64) permettant de couvrir toute les adresses de la mémoire.

En réalité un nouveau segment commence tous les 16 octets aussi appelé paragraphe (ha tient comme dans l'entête, comme quoi...). Cependant vous allez me dire "mais un segment c'est pas censé faire 64Ko ?" si "mais alors les segments se superposent ?" hééééé oui sourire

En clair cela signifie qu'une position dans la mémoire peut être ciblée par plusieurs couples segment/offset par exemple la position absolue 66 peut être adressé par 0000:0042, mais aussi par 0001:0032, par 0002:0022, par 0003:0012 ou encore par 0004:0002. Toutes ces adresses sont équivalentes. Un grand merci à Benoît-M pour ces explications (ainsi que pour d'autres à venir d'ailleurs).

Par ailleurs il faut bien comprendre qu'un pointeur absolu à besoin de 20bits pour couvrir tout les 1Mo de mémoire, or les registres ne font que 16bits, c'est pourquoi dans un programme lorsqu'on parle d'adresse on ne manipule principalement que l'offset, le segment se trouvant dans registres bien précis les registres segments : ES, CS, SS, DS, FS et GS.

Laissez un commentaire

1 Commentaire

Laissez un commentaire

Vous devez être connecté pour commenter sur le Refuge. Identifiez-vous maintenant ou inscrivez-vous !


Marre des pubs ? Inscrivez-vous !