Asm : fonction 6ch de l'interruption 21h

Résolu/Fermé
Utilisateur anonyme - 28 déc. 2009 à 15:29
 Utilisateur anonyme - 29 déc. 2009 à 13:55
Bonjour,

Je suis en train de créer un programme en assembleur. Mais j'ai un problème pour l'utilisation de la fonction 6ch.

Voici la page de ma documentation sur cette interruption :

Entrée :

AH 	= 6Ch
	AL	= 0
	BX 	= Mode d'accès
	CX 	= Attribut de fichier
	DX 	= Réaction DOS
	DS:SI 	= Pointeur FAR sur le buffer contenant le nom de fichier.

Sortie :

Flag Carry = 0 : Tout va bien, dans ce cas
		AX = Handle du fichier
		CX = Statut
	Flag Carry = 1 : Erreur, dans ce cas
		AX = Code d'erreur
			1 : Logiciel de partage de fichier absent
			2 : Fichier non trouvé
			3 : Chemin non trouvé ou fichier inexistant
			4 : Plus de handle disponible
			5 : Accès refusé
			12 : Mode d'accès interdit

Remarques :

·	Le nom de fichier doit être une chaîne ASCII terminée par un caractère de fin (code ASCII 0). Outre la désignation du périphérique, il doit contenir la désignation complète du chemin et un nom de fichier, mais pas de jokers. Si la désignation de périphérique ou de chemin fait défaut, l'accès portera sur le périphérique ou le répertoire en cours.
·	Le mode d'accès se construit comme suit :

Je ne comprend pas ce qui suit
Bit 0-2 : Autorisation de lecture/écriture
	000b 	= 	Le fichier est destiné uniquement à la lecture
	001b 	= 	Le fichier est destiné uniquement à l'écriture
	010b 	= 	Le fichier est destiné à la lecture et l'écriture
Bit 3 : 0b
Bit 4-6 : Mode de partage de fichier
	000b 	= 	Seul le programme en cours peut accéder au fichier (mode de compatibilité)
	001b 	= 	Seul le programme en cours peut accéder au fichier
	010b 	= 	Un autre programme peut lire le fichier mais ne peut pas y écrire

011b 	= 	Un autre programme peut écrire dans le fichier mais ne peut pas le lire
	100b 	= 	Un autre programme peut écrire dans le fichier et le lire
Bit 7 : Flag Handle
	0 	= 	Le programme enfant du programme en cours peut également accéder au handle de ce fichier
	1 	= 	Seul le programme en cours peut accéder au handle de ce fichier
Bit 8-12 : 0b
Bit 13:0 	= 	En cas d'erreur grave, appeler l'interruption 24h
	1 	= 	En cas d'erreur grave, retourner le code d'erreur correspondant dans AX mais ne pas appeler l'interruption 24h

Bit 14:1 	= 	Lors de tout accès en écriture sur le fichier, adapter immédiatement l'entrée du répertoire
Bit 15 : 0b


Tout ceci. Je ne vois pas comment modifier les valeurs de plusieurs bits différents. Car le résultat doit être placé dans CX, hors si l'on veut spécifier plusieurs caleurs, je ne voit pas comment faire.

Merci d'avance à ceux qui trouveront la réponse à cette question délicate =)

3 réponses

loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
28 déc. 2009 à 16:15
Le registre CX est un registre 16 bits; il peut par exemple contenir 4092h; ce qui donne aussi 0100000010010010b. Décortiquons sa signification:
- bit 15    = 0b
- bit 14    = 1b : Lors de tout accès en écriture sur le fichier,  ...
- bit 13    = 0b : En cas d'erreur grave, appeler l'interruption 24h
- bit  8-12 = 0b
- bit  7    = 1b : Seul le programme en cours peut accéder au handle ...
- bit  4-6  = 001b : Seul le programme en cours peut accéder au fichier
- bit  3    = 0b
- bit  0-2  = 010b : Le fichier est destiné à la lecture et l'écriture
Chaque bit a donc une signification, mais on donne au registre la valeur de l'ensemble des bits.
Bonne continuation.
0
Utilisateur anonyme
29 déc. 2009 à 11:49
Merci, donc en gros le bit tout à gauche dans le nombre 101100100101010 vaut bien 1 (il est bien à gauche) ?

Et le bit 0 est tout à droite ?
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
29 déc. 2009 à 12:37
Affirmatif, en gros comme en petit !
Comme il s'agit d'un mot de 16 bits, le bit de gauche est le bit 15 (représente 2 puissance 15) et celui de droite le bit 0 (représente 2 puissance 0). En fait c'est comme pour un nombre décimal (Le nombre 1837 est : 1 fois 10^3 + 8 fois 10^2 + 3 fois 10^1 + 7 fois 10^0) mais en base 2.
0
Utilisateur anonyme
29 déc. 2009 à 13:55
Oui merci je savais pour les puissances mais je savais pas dans quel ordre on les écrivaient. Merci =)
0