3 votes

C Linux lit/écrit un mot de la mémoire (segment,offset)

Je travaille à la programmation d'un programme d'amorçage Linux pour un devoir d'enseignement et je sais que je dois créer une fonction qui lira/écrira un mot de/vers la mémoire. J'ai du mal à déterminer si je suis sur la bonne voie ou non et toute aide serait la bienvenue. Je testerais bien ces fonctions mais pour l'instant ce n'est pas possible pour moi car je dois travailler sur la construction des fonctions de base avant de pouvoir tout assembler. On m'a donné get_byte(segment,offset)/put_byte(char,segment,offset) dont le fonctionnement a été vérifié par mon professeur, codées en assembleur et exportées en C.

unsigned short get_word(unsigned short segment, unsigned short offset)
{
 unsigned short word, low, hi;
    low = get_byte(segment, offset);
    high = get_byte(segment, offset+1);
    word = low+hi;
    return word;
}

Je ne suis pas sûr que ce qui précède soit correct. Je sais que le haut et le bas doivent être combinés, est-il possible de les ajouter ou dois-je simplement faire bas et haut et renvoyer le résultat ? Si je suis totalement à côté de la plaque, faites-le moi savoir. Est-il correct que l'offset soit unsigned short ou doit-il être int ?

int put_word(unsigned short word, unsigned short segment, unsigned short offset)
{
   unsigned short low, hi;
   low = word | offset; 
   hi = word | offset+1
   put_byte(segment, low);
   put_byte(segment, hi);
   return 0;
}

Je n'ai aucune idée si le code ci-dessus est proche de la réalité, mais c'est ma meilleure hypothèse.

Quelqu'un connaît-il la solution ou a-t-il des conseils ? Ces fonctions devraient être assez basiques mais je suis coincé et j'ai besoin de me lancer dans la vraie partie de mon travail.

MISE À JOUR (12:46) : Corrigé put_byte(), comme indiqué ci-dessous, cela n'aurait pas de sens d'accepter seulement deux arguments, corrigé cela. Je m'excuse pour mon erreur.

3voto

Daniel Gehriger Points 4101

Sur get_word() :

word = (high << 8) | low

Sur put_word() :

low = word & 0xff;
hi = word >> 8;
put_byte(low, segment, offset);
put_byte(hi, segment, offset+1;

Je doute que put_byte Il suffit de deux arguments, comme vous l'avez dit. Ça n'aurait pas de sens.

2voto

BlackBear Points 10069

Ils ont tort. Pour faire un mot commençant par 2 octets, vous devez :

word = (byte2 << 8) | byte1

en supposant que l'octet 2 suit l'octet 1 en mémoire et que vous voulez votre mot au "format" little-endian. Pour diviser un mot en deux octets, il faut.. :

byte1 = word & 0xff
byte2 = word >> 8

Avec les considérations ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X