2015-10-06 2 views
7

En C, comment écrire dans un emplacement de mémoire particulier, par ex. mémoire vidéo b800, sous DOS (DOS réel, MS DOS 6.22)En C, comment écrire dans un emplacement de mémoire particulier, par ex. mémoire vidéo b800, sous DOS (DOS réel, MS DOS 6.22)

Je comprends que C n'a rien intégré pour le faire, mais qu'il peut y avoir une certaine plate-forme spécifique, par ex. Fonctions API spécifiques à DOS qui peuvent.

Un petit programme de démonstration qui le ferait serait génial.

Je Turbo C (TCC.EXE - pas minuscule compilateur c, compilateur Turbo C)

Je sais que le débogage peut le faire (par exemple, une partie du tout petit peu de débogage que je sais) -f b800:0 FA0 21 CE (qui écrit certains points d'exclamation à la ligne de commande). Mais je voudrais un programme C pour écrire à b800: 0

+3

pouvait ceux qui ont voté pour fermer, état un motif? – barlop

+0

Votre système dispose-t-il d'une mémoire segmentée ou paginée? Avez-vous besoin de faire des pointeurs de loin et de près? – dawg

+0

@dawg ** DOS ** signifie segmentation – fjardon

Répondre

7

L'adresse b800:0000 utilise un segment de 0xb800 et un décalage de 0x0000. Cela correspond à l'adresse linéaire 0xb8000 (notez le 0 supplémentaire, car le segment est décalé de 4 bits vers la gauche).

Pour créer un pointeur vers cette adresse dans protected mode, vous utiliseriez

char *p = (char *)0xb8000; 

Cependant, vous êtes très probablement real mode, donc vous devez construire un far pointer:

char far *p = (char far *)0xb8000000; 

Le La valeur de 32 bits est divisée en deux valeurs de 16 bits, qui sont affectées au segment et au décalage.

Vous pouvez utiliser ce pointeur normalement, puis:

*p = '!'; 
+2

Pour être certain pour réellement * voir * quelque chose, il est préférable de définir l'attribut de caractère. – fjardon

+0

@fjardon a raison. Vous pouvez ajouter un exemple pour une fonction "chaîne écrire avec la couleur". Le PO peut ne pas être conscient de l'entrelacement des données de caractères et d'attributs. – usr2564301

+0

Je suis sûr que j'ai eu ce travail dans l'invite de commande Windows 7. codeblocks IDE lance une console de commande pour exécuter des programmes. Mais maintenant je l'essaie, je reçois ces erreurs http://i.imgur.com/7jtfbca.png gcc donne les mêmes erreurs. http://pastebin.com/raw.php?i=AtscYUJW Certainement win7 32bit avait debug.exe qui vous laissait '-f b800: 0 FA0 21 CE' Donc je ne vois pas pourquoi il ne compile pas dans Win7? Je suis sûr qu'il l'a fait – barlop

3

Pouvez-vous essayer (non testé car je n'ai pas mon vieux PC)

char far* video = 0xb8000000L; 
*(video++) = '!'; 
*(video++) = 0x0A; 
0

il suffit de créer un pointeur vers la base adresse et ensuite accéder à la mémoire comme si c'était un tableau. Rappelons qu'en mode texte, il y a deux octets pour chaque caractère affiché à l'écran. Le premier, détient le personnage lui-même. La seconde détient l'attribut. Les 4 bits d'ordre élevé sont l'attribut d'arrière-plan et les 4 inférieurs sont l'avant-plan. La définition du bit le plus élevé dans l'attribut de premier plan en fait une couleur de haute intensité, tandis que la définition du bit d'ordre supérieur dans l'attribut d'arrière-plan provoque le clignotement de l'avant-plan. Cela signifie qu'il y a 8 couleurs disponibles pour l'arrière-plan, 16 disponibles pour le premier plan et enfin la possibilité de faire clignoter le texte.

Par exemple, pour le mode stuff 0x13: char far *graphScreen = (char far*) 0xA0000000;

Et pour des trucs en mode texte, char far *textScreen = (char far*) 0xB8000000;

Pour écrire à la mémoire d'écran est donc aussi simple que textScreen[ someIndex ] = someChar; textScreen[ someIndex+1 ] = someAttrib;