CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

La segmentation de la mémoire

LarbiBnMhidi
LarbiBnMhidi
Niveau 10
26 septembre 2017 à 13:24:36

Salut, j'aurais un peu besoin d'aide pour comprendre :(

J'ai bien compris que lors de l'exécution d'un programme, les instructions sont copiées dans la partie .text de la mémoire, les variables globales dans la partie .data, etc.

Seulement, lors de l'exécution du programme, comment est ce que la distinction est faite entre tout ça ? :(

Prenons ce code, par exemple :

global _start
        section .text

_start:
        mov eax, 1
        int 0x80

        section .data

        onche : dd 0xCAFECAFE

En en faisant un binaire brut (nasm -f bin main.S) ça nous donne ça en hexadécimal :

 66 B8 01 00  00 00 CD 80  FE CA FE CA 

66 B8 01 00 c'est le mov eax, 1
CD 80 c'est le int 0x80

Mais le truc c'est que le CAFECAFE ça se retrouve tout seul à la fin, sans aucune indication de foutre ça dans .data ou je ne sais où :hap: Du coup comment est-ce que la mémoire peut "deviner" qu'elle doit le mettre dans .data ?

J'ai regardé ce que donnait le truc en .elf mais ça a l'air d'être la même chose, aucune indication :

https://image.noelshack.com/fichiers/2017/39/2/1506425057-screenshot-16.jpg

arsh222
arsh222
Niveau 10
26 septembre 2017 à 13:47:29

Les sections sont mappées quelque part dans les métadonnées du programme, dans ton exemple les infos sur la section .text commencent visiblement à l'offset 194 et le nombre à l'offset 1A4 indique l'adresse de la section
https://en.wikipedia.org/wiki/Executable_and_Linkable_Format

LarbiBnMhidi
LarbiBnMhidi
Niveau 10
29 septembre 2017 à 15:04:12

D'accord merci, tu aurais un lien un peu plus détaillé sur le sujet ? :(

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment