Bonjour,
je voudrais savoir comment on peut accéder et communiquer avec les ports (série, parallèle, USB, ....etc) de l'ordinateur avec le language assembleur.
merci d'avance...
Bonjour,
je voudrais savoir comment on peut accéder et communiquer avec les ports (série, parallèle, USB, ....etc) de l'ordinateur avec le language assembleur.
merci d'avance...
Pour faire tout ça,on utilise les drivers,voir le DDK (Drivers devellopement Kit) chez MSN.
Si on veut simplement les utiliser,quelques API suffisent.
merci pour votre réponse , mais où je peut trouver de la documentation sur la DDK et les API
Pour accéder aux ports RS, IEEE, // c'est simple, ou pas selon que vous êtes sous XP, sous W2000 ou avec d'autres systèmes.
Dans le meilleur des cas (c'est-à-dire pas sous XP) l'espace d'E/S n'est pas dans un segment inaccessible et il suffit d'écrire ou de lire le port du composant ; bien sur pour faire des "trucs" exotiques il faut disposer des "data sheet" mais sinon c'est facile.
Dans le cas de XP (de MAC OS et de certains LINUX) c'est nettement plus tordu, ou alors pour XP il faut utiliser "impout.dll" avec la limitation de la milliseconde.
Dites-nous en plus, peut être quelqu'un aura votre solution.
Pour USB cela devient nettement plus complexe, à cause de l'imbrication logiciel/matériel de la norme ; je suis justement entrain de travailler sur ce problème pour mon mini système d'exploitation personnel qui me sert dans des automates.
Si c'est un probleme de doc,içi
La programmation de drivers sous Windows XP se fait en C et non en assembleur, en utilisant le DDK (Il y a aussi le WDK, Windows Driver Kit, qui est un sur ensemble du DDK c'est-à-dire un DDK plus complet ...).
DDK
Pour une simple histoire d'E/S sur les ports on préferera utiliser des outils déjà existants, comme Inpout32.dll par exemple, qui peut être utilisé avec C, C++ ou VB ...
je cite
Belle ignoranceLa programmation de drivers sous Windows XP se fait en C et non en assembleur
Driver en assembleur
Un pilote s'écrit aussi bien en C (++) qu'en assembleur, encore que dans certains cas critiques de gestion de temps l'assembleur reste irremplaçable.
Pour ce qui est des DLL (par exemple inpout.dll que je citais dans mon dernier message) je ne vois vraiment pas pourquoi elle ne seraient accessibles qu'en C !
Chacun sait que les compilateurs C ne sont généralement que des transcripteurs vers de l'assembleur (assemblé ensuite durant le processus)
je n'avais pas vu le lien en bas du dernier message de "toutEnMasm" c'est net et sans appel.
Non! Non! Non! Si t'as déja pris la peine de lire la doc du DDK, c'est bien écrit, pour les gens qui savent lire (et qui ont le DDK!), qu'un driver pour Windows NT se programme en C et uniquement en C, en utilisant le DDK. Cependant, rien ne peut empêcher le fait qu'il peut y avoir d'autres solutions "clandestines", incomplètes, sans garantis ...
Ni "ToutEnMasm" ni moi ne confondons DLL et pilote, nous cherchons simplement à répondre à la question posée.
Malgré sa lenteur "inpout32.dll" est souvent suffisante, le DDK à effectivement des solutions de "remplacement" plus ou moins simples et fiables.
Sinon il reste aussi quelques méthodes pour se retrouver en "ring 0" ...
Autre possibilité le simple appel suivant (ici en C) :
rs = CreateFile(periph, GENERIC_READ, 0, NULL, OPEN_EXISTING, NULL, NULL); //FILE_FLAG_OVERLAPPED
... avec l'aide d'un driver qui, lui, tourne en ring0.Envoyé par Stabia
... ce qui va envoyer le code IRP_MJ_CREATE au driver associé au périphérique (dont le nom, periph, est lui même une "invention" du driver). Si aucun driver n'a déjà été chargé, l'appel va tout simplement échouer. Sinon (sauf pour quelques rares exceptions comme dans le cas d'une communication série avec un modem), il faut maintenant savoir comment communiquer avec le driver ...Autre possibilité le simple appel suivant (ici en C) :
s = CreateFile(periph, GENERIC_READ, 0, NULL, OPEN_EXISTING, NULL, NULL); //FILE_FLAG_OVERLAPPED
Je faisais allusion à quelques méthodes utilisant certaines portions de code NT qui sont accessibles en lecture pour indirectement changer un vecteur (division par 0 par exemple), puis par ce biais se retrouver tranquillement en "ring 0".
Quand à mon exemple en C il suffit de mettre "COM3" dans "periph" pour accéder au port RS 3[4], il est inutile qu'il ait un pilote chargé (autre que celui standard); maintenant si le périphérique est "intelligent" alors bien sur il faut une interface avec lui.
Encore que ...
bon pour acceder aux ports d'es, il faut connaitre leurs addresses, ici ça parle d'asm ou de DDK?
une fois que tu as l'addresse, chargée dans dx, tu fait des:
un exemple tout simple pour ecrire le port parralelle, pour en voire le resultat, il te faut 8 leds et huit resistances, ces huits leds ( diodes electroluminescentes ) vont etres connectés aux broches 2,3,4,5,6,7,8,9 et les masses qui sont à l'opposé..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 mov al,octet_que_tu_veux out dx,al
et ça marche, ne pas oublier les resistances, sinon, les leds vont faire la tronche..
sinon, cet exemple affiche des trucs a l'ecran, ce qui est censé etre en sortie du port LPT1
a la base, ce programme etait pour les 68HC11 et les 6809, comme quoi , le portage est possible, il suffit de connaitre l'assembleur
l'adresse des ports est standard et de toutes façon accessible (segment 0x40 du BIOS) mais connaître l'adresse ne sert à rien sur la plupart des S.E. puisque le segment d'E/S est inaccessible en 'ring 3'.
Pour le reste voire les remarques ci-dessus.
ouais exact, et pour plus de details tu charges helppc.com
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager