2010-10-27 5 views
2

Quelqu'un peut-il m'expliquer ce code d'assemblage?explication du code d'assemblage

LINEAR_DATA_SEL equ $-gdt 
    dw 0FFFFh 
    dw 0 
    db 0 
    db 92h  ; present, ring 0, data, expand-up, writable 
    db 0CFh  ; page-granular (4 gig limit), 32-bit 
    db 0 

Ici, je l'ai déjà googlé sur la commande EQU, dw et db, mais je ne comprends pas ce que ce code ne fait (en particulier la première ligne). quel est ce $ -gdt et les paramètres de dw et db? Veuillez expliquer en détail si possible. Merci d'avance.

+1

Je suis sûr que ce n'est pas du tout le code, mais la définition des données. Il définit le symbole LINEAR_DATA_SEL, puis définit certains mots et octets de données qui le suivent. Je ne suis pas sûr du bit -gdt (c'est pourquoi je ne l'ai pas entré comme réponse). –

Répondre

7

Il s'agit en fait d'une entrée de 8 octets dans la table des descripteurs globaux. Il crée un descripteur adressant l'ensemble de l'espace adresse 4G en tant que sélecteur.

Le equ $-gdt définit une valeur dans l'assembleur égale à la différence entre cet emplacement ($) et le libellé gdt. En d'autres termes, c'est le décalage de cette entrée dans le GDT lui-même.

La structure d'une entrée GDT est la suivante:

          alt text

où les parties individuelles sont expliquées ci-dessous.

          alt text

Pour vos valeurs spécifiques:

(a) dw FFFFh 
(b) dw 0 
(c) db 0 
(d) db 92h  ; present, ring 0, data, expand-up, writable 
(e) db CFh  ; page-granular (4 gig limit), 32-bit 
(f) db 0 
  1. L'adresse de base est calculée à partir des f, c et b champs, de la plus importante au moins - parce que ce sont tous zéro, la base est à zéro.

  2. La limite de sélection est calculé à partir des 4 bits de plus à droite e et tous a, pour donner 0xfffff dans ce cas. Cela a ajouté 1 pour donner 0x100000. Voir le point 3 ci-dessous pour ce que cela signifie.

  3. Les 4 premiers bits de e (les drapeaux) définissent la granularité (4K plutôt que 1 octet) et la taille de l'opérande (32 bits). Avec une granularité de 4K (12 bits) et un nombre de pages de 0x100000 (20 bits), vous disposez de votre espace d'adressage complet de 32 bits (4G).

  4. Le champ d est l'octet d'accès et définit les propriétés suivantes basées sur 0x92:

    • Pr présente (en mémoire) à peu vrai.
    • Privl niveau privé à 0 (besoin d'être 0 pour avoir accès).
    • Ex bit 0 exécutable (sélecteur de données).
    • DC, le bit de direction est 0, le segment se développe.
    • RW de 1, la mémoire est accessible en écriture. bit consulté
    • Ac réglé sur 0.
+0

J'ai l'impression d'avoir raté quelque chose en dormant à travers des cours d'architecture informatique :) –

3

db/dw signifie un mot de données/un octet de données. Ce sont quelques données, sans contexte cela pourrait signifier n'importe quoi, c'est pourquoi il y a quelques commentaires. equ signifie égal, il est utilisé pour stocker des constantes. Je suppose que gdt est défini ailleurs comme l'adresse de/pointeur vers le Global Descriptor Table.

Il y a un GDT tutorial ici qui utilise les mêmes constantes pour un appel de fonction:

/* Setup a descriptor in the Global Descriptor Table */ 
void gdt_set_gate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran) 

[...] 

/* The third entry is our Data Segment. It's EXACTLY the 
* same as our code segment, but the descriptor type in 
* this entry's access byte says it's a Data Segment */ 
gdt_set_gate(2, 0, 0xFFFFFFFF, 0x92, 0xCF);