Tracer les Dlls -- Notion de base de l'informatique

M

Myrdinn

Invité
Voici le deuxième post de la série
Si vous avez manqué le premier vous pourrez le trouver et lire ici

Je vais faire un rapide résumé de ce que vous avez besoin pour suivre les prochains posts.
Les parties sont loins d'être exhaustives. Si vous voulez ou avez besoin de plus de détails je donnerais des liens ou répondrais a vos questions suivants les demandes.

Le but n'est pas de vous initiez à l'informatique ni de faire de vous un programmeur en assembleur

Les premiers points ne sont pas essentiels mais comprendre le fondement et la structure physique qui ont batit les contraintes et les bases de l'assembleur c'est toujours profitable.

1) Algébre booléenne et opérateur Logique
Je n'aborderais que les bases de l'algèbre booléen. A lui tout seul, il est souvent le sujet d'un livre entier :lol: . Cependant je suis toujours dispo pour plus de précision.


La logique booléenne est la base des opérations des ordinateurs modernes binaires. On peut représenter n'importe quel algorythme ou n'importe quel circuit electronique informatique en utilisant un système d'équations/opérations booléene.

Bon maintenant un peu de mathématique et de définition :D. Pas la peine de suivre complétement ou de retenir (je la mets en size1 exprès), mais comme on manipulera souvent les bits en assembleur nous aurons certainement besoins de cette partie surtout quand vous travaillerez seul

L'algèbre booléen est un système mathématique ou toute les valeurs sont limitées à 0 ou 1 (Respectivement Faux et Vrai)
Un opérateur booléen accèpte des booléens en entrée et produit une seule valeur booléene en sortie. Des exemples d'opérateur sont AND(et) OR (ou) et NOT(Non). Ils agissent de la même manière que leur équivalent linguistique
Exemple (O AND 1) est l'équivalent de (Faux ET Vrai) (Une phrase qui contient un élément vrai et un faux est une phrase Fausse :) )
Donc 0 AND 1 = 0

Dans ce système il faut tenir compte des postulats suivants Appelons A et B des variables Booléenes (Donc ayant pour valeur 0 ou 1) et x un opérateur
P1) Closure. Tout opérateur est "clos" (Tiissa me dira si c'est le bon terme ;) ) si il produit un résultat booléen à partir
d'une paire de booléen en entrée
P2) Commutativité. Un opérateur x est commutatif si AxB = BxA pour toute valeur de A et B
p3) Assiociativité. Un opérateur x est associatif si (AxB)xC=Ax(BxC)
p4) Ditribution. 2 opérateurs x et y sont ditributifs si Ax(ByC)=(AxB)y(AxC)
p5) Identité. Une valeur booléene I est un élément d'identité pour un opérateur x donné si AxI=A
p6) Inverse. Une valeur booléene I est un élément inverse pour un opérateur x donné si AxI=NOT(A) ou encore B ou B<>A pour toute valeur de A et B comme tous les autres Postulats

Suivent ensuite d'autres postulats.
P1) L'Algèbre Booléenne est limitée au opérateur AND OR et NOT (tous les autres opérateurs sont des combinaisons de ces 3)
P2) L'identité pour AND est1 et l'identité pour OR est 0. Pour NOT il n'y a pas d'identité
P3) AND et OR sont commutatifs
P4) AND et OR sont respectivement Distributifs. A AND (B OR C)= (A AND B) OR (A AND C) idem en inversant OR et AND
P5) AND et OR Sont respectivements Associatifs
P6) Pour toute valeur A il existe une valeur NOT(A) tel que A AND (NOT(A))=0 et A OR (NOT(A))=1. C'est d'ailleurs la définition du compélment logique NOT (O est le NOT(1) et 1 est le NOT(0) )

Ces postulats servent à prouver les théorèmes suivant (Je vous epargne la démonstration)
Th1) A OR A = A
Th2) A AND A = A
Th3) A OR 0 = A
Th4) A AND 1 = A
Th5) A AND 0 = 0
Th6) A OR 1= 1
Th7) NOT(A OR B)= NOT(A) AND NOT(B)
Th8) NOT(A AND B)= NOT(A) OR NOT(B)
Th9) A OR (A AND B) = A
Th10) A AND (A OR B) = A
Th11) A OR (Not(A) AND B) = A OR B
Th12) NOT(A) AND (A OR NOT(B)) = NOT(A) AND NOT(B)
Th13) (A AND B) OR (A AND NOT(B)) = A
Th14) (NOT(A) OR NOT(B)) AND (NOT(A) OR B) = NOT(A)
Th15) A OR NOT(A) = 1
Th16) A AND Not(A) = 0

Bon évidemment pas la peine de retenir tout ça, mais ca pourra vous servir.

Par contre il vous faut retenir les table de vérité suivantes.
TableVerite.gif

C'est la base de toute fonction booléenne. Vous aurez compris que on choisit une ligne et une colonne suivant les 2 valeurs en entrée et que leur intersection est le résultat de l'opération AND et OR comme le nom du tableau l'indique.

Venons en aux fonctions booléene. Une fonction est une suite d'opération booléene. Par exemple il existe une fonction F qui fait
l'opération suivante sur les Variable A B et C F= (A AND B) OR C.

Pour n Variable en entrée il existe 2 a la puissance 2 puissance n Fonctions différentes (Il en existe autant que vous voulez mais au final il ne peut y avoir que 2^2^n résultats possibles). Pour 2 variable A et B il existe 16 Fonctions que je me dois d'énumérer car nous les utiliserons fréquemment. (Si vous insister je vous dirais comment trouver les numéros mais ca sera pour une autre fois)
LEs 16 (2^2^2) résultats possibles pour les fonctions Fx(AB) sont
F0 Fonction ZERO ou EFFACEMENT. Le resultat est toujours ZERO
F1=NOR equivalent de NOT(A OR B)
F2=INHIBITION de B AND NOT(A) correspond à B>A ou A<B
F3=NOT(A) et donc ignore toujours B
F4=INHIBITION de A AND NOT(B) équivalent à B<A ou A>B
F5=NOT(B) et donc ignore toujours A
F6=XOR(Exclusive OR) équivalent de A<>B
F7=NAND NOT(A AND B)
F8=AND
F9=EQUIVALENCE c'est à dire A=B
F10=COPY B ou encore =B et donc ignore A
F11=IMPLICATION B implique A. Donne Si B Alors A ou encore B>=A
F12=COPYA=A donc ignore B
F13=IMPLICATION A implique B. Donne Si A Alors B ou encore A>=B
F14=OR
F15=1 ou SET. Resultat=1 quelques soit A ET B
Je vous laisse deviner tous seul les différentes utilisations des opérateurs qui mêne à ces résultat a partir de A et B en entrée

Bon c'est bien joli mais quel est le rapport avec les ordinateurs???
C'est le prochain chapitre de ce même post

2) Les circuits Electroniques
Il y a une correpondance directe (1 pour 1) entre les circuits electroniques et les fonctions booléenes. Pour chacune des fonctions vous pouvez construire un circuit electronique et vice Versa. Comme nous l'avons vu on peut tout construire seulement avec des circuits AND OR et NOT. En réalité un seul circuit suffit c'est le circuit NAND(Fonction F7) ce qui permet une unification et miniaturisation des circuits.
LogicalUnit.gif

Pour vous prouvez que l'on peut créer n'importe quel fonction il suffit de prouver que l'on peut faire des AND OR et NOT à partir de NAND.

NOT a partir de NAND. Il suffit de mettre 2 fois la même variable en entrée puisque l'on obtient NOT (A AND A)= NOT(A)

AND a partir de NAND. A AND B et equivalent à (NAND AB) NAND (NAND AB) Donc il suffit de combiner 2 circuits NAND en serie

OR à Partir de NAND. Bon la c'est pas aussi trivial il faut appliquer le Théorème de DeMorgan (Th7)
NOT(A OR B)=NOT(A) AND NOT(B).
A OR B= NOT(NOT(A) AND NOT(B)) l'inverse est vrai, il suffit de remplacer chaque coté par son NOT.
A OR B= NAND(NOT(A)NOT(B)) en appliquant la définition de NAND (Cf Fonction 7).

La même chose en image
NANDGate.gif


Les circuits combinatoires
Ces circuits combinent différentes opérations booléenes de bases (OR,AND,NOT) avec quelques entrées et sorties. Chaque sortie
correspond à une fonction, et donc chaque circuit représente autant de fonction qu'il à de sortie pour un nombre limité d'entrée.
Un processeur est constitué d'un très grand nombre de différents circuits combinatoires.
Je ne m'étendrais pas sur ce point car la compléxité des processeurs fait que je vous noierais dans des détails insignifiant, de plus mes capacités au fur et à mesure que l'on avance dans les générations de processeurs seraient très vite dépassées. Cependant plus loin dans le post ou au cours d'un trace je n'hesiterais à vous donner quelques exemples précis si j'en ai l'occasion

Revenons aux circuits combinatoires car j'en ai besoin pour la suite. Le problème d'un circuit de base c'est qu'il n' a pas de mémoire. Il est dynamique une fois le calcul effectué, l'information continue sont circuit mais n'est jamais stoquée. C'est la qu'il faut faire intervenir une horloge et la logique qui va avec. A partir de 2 NAND on peut construire la base de ceci avec un SET/RESET Flip Flop. Je ne vais pas partir dans des détails electriques mais c'est la base qui vous permet en faisant alterner les entrées entre 0 et 1 (L'horloge) de maintenir une valeur.
FlipFlop.gif

L'image du bas vous montre le circuit mémoire complet, avec l'horloge(Clk) qui permet de maintenir la valeur Q et le complément qui permet de charger le data dans Q. Si on répète ce circuit 8 fois en parrallèle on obtient le schéma ci dessous. C'est un registre 8 Bit nous en reparleron plus tard.
registre.gif


Une autre utilisation qui vous donne sans doute une image plus parlante de l'interet de garder un signal jusqu'à la prochaine modification. Bien que ce "registre" 7 bits n'est utilisé que pour 10 Valeurs sur 128 possibles
Horloge.gif


Bien maintenant qu'est ce que ca à a voir avec la programmation? C'est ce que nous allons voir dans le prochain point
 
M

Myrdinn

Invité
Vous avez vu les bases pour faire des opérations, des échanges et stoquer des informations en mémoire/registre. Evidemment les systèmes actuels sont bien plus complexes que les bases que je vous ai montrées.

L'important à retenir de la première partie c'est que tout algorythme que vous implémenté en software peut être implémenté directement par des circuits Hardware. L'inverse est également vrai, tout les circuits Hardware peuvent être émulé par des softwares (Puisque les 2 font des opérations booléenes équivalentes).

Les ordinateurs sont construits sur cette base, Tout les éléments hardware doivent être simplifié pour être minimisés et polyvalents, toutes les fonctions complexes par économie seront gérées par le software, c'est la qu'intervient l'assembleur = Combiner les opérations simples. Schématiquement, chaque instructions assembleur active une fonction Hardware (Le plus basique possible) du processeur et c'est l'assemblage de ces fonctions dans des programmes qui émule les fonctions hardware manquantes.

Avec le temps les systèmes deviennent plus complexes, l'augmentation du nombre de Bits lus simultanément permet d'augmenter le nombre d'instruction SET et donc de fonctions codées directement en hardware. Maintenant il est temps de voir les différents éléments du système.

3) Les composants du système
Je vais encore une fois utilisé un système simple et réducteur, je ne prendrais pas le cas des processeur avec 2 niveaux de
caches, les interactions avec les processeurs des cartes graphiques...
Dans mon système c'est le processeur qui gère toute la machine, peut m'importe de savoir si je passe par un bus controllé par des circuits sur la carte mère, c'est juste pour que vous compreniez ce que le programme en assembleur peu effectuer.

Architecture de Von Neumann
D'ailleurs ce n'est pas mon système mais celui de Jhon Von Neumann (VNA), qui possède 3 composants majeurs. L'Unité Processeur Centrale(CPU Désolé pour la traduction), la mémoire et un système I/O pour (entrée/sortie). Dans ces machines, tous les actions ont lieu dans la CPU. Les données et les instructions du CPU résident en mémoire. Le système I/O est géré comme de la mémoire sauf qu'il entraine une action sur le monde extérieur(Sortie) ou interroge ce monde (Entrée) (Exemple, clavier,souris,ecran (Via la carte vidéo et la carte Mère mais peut importe mon système n'a pas besoin d'être compliqué),...).
VonNeumann.gif


Système bus
Pour communiquer entre le processeur et le reste il faut un lieu d'échange. En informatique ce sont des Bus, ni plus ni moins des fils qui transportent des 0 et des 1 (même si les formes actuelles et leur controlleur en font des éléments complexes).
Je ne vais pas tous les énumérer mais seulement les principaux et communs à tout système.

Le DATA BUS. Il défini la taille du processeur. Actuellement et ce depuis les pentium c'est du 64 Bits (Bref 64 Fils :lol: )C'est le nombre de bit que le processeur peut echanger avec la mémoire (ou un système I/O) en 1 cycle d'horloge.

Maintenant comment le processeur choisit avec qui il fait l'echange? C'est le role de L'ADDRESS BUS. Chaque mémoire et Matériel possède une adresses unique.

Ensuite pour controller dans quels sens se fait l'échange (Lecture/ecriture Mémoire ...) Il faut un autre Composant Le CONTROL BUS.

Voila les seuls bus que vous devez retenir (et vous verrez concretement quand on attaquera le code qu'ils ont une grande importance en assembleur) sont le DATABUS, ADDRESSBUS et CONTROLBUS

Quelques élément du processeur
Etant donné que l'assembleur utilise directement des éléments du processeur je dois vous donner quelques éléments de base. Au début j'avais pensé vous donner l'évolution des différentes générations des processeurs du 8088 au PIII, pour vous montrer
l'arrivé des différents éléments, mais le post deveint long et je préfère rester sur un système simple. Quand au travers du code
on rencontrera des structures plus compliqué (Prefetch Queue,Pipeline...) je ferais des appartés pour les expliquer.

Bref Les bases.

1) Les registres. Ce sont de mémoires implémentées directement dans la CPU. Dans notre cas elles font 32 Bits et contiennent donc un doubleWord en taille. Il existe de nombreux registres, chacun ayant des fonctions spécifiques, mais la plupart peuvent être utilisé pour contenir les données directement.

J'en profite pour faireun aparté. La CPU utilise 3 sortes de mémoires que je vais énumérer du plus rapide d'accès au plus lent.

a) Les registres,
ils sont directment modifiés par les Instructions assembleur, toutes les opérations se font sur eux. Si on veux faire une opération sur une autre mémoire il faut d'abord la charger dans un registre. Etant limité et ayant des fonctions spécifiques, les registres changent très fréquemment de valeur comme vous le verrez mais contiennent directement les infos dont nous aurons besoin.

B) La pile. c'est une zone mémoire particulière. Elle s'appelle ainsi car elle est gérée comme une pile (D'assiette, de feuille.. comme vous voulez. Sauf que la elle contient des DATA) Sa taille augmente/diminue à chaque fois que vous posez/enlever quelques choses dessus et la dernières valeurs posées sera la première reprise. Par la peine de vous torturez à comprendre vous verrez très vite à quoi elle sert

C) La mémoire (Je devrais dire les mémoires avec les différents niveaux de cache du processeur et des memoires) C'est la plus longue car il faut pour l'acceder charger l'adresse Bus.

Afin d'être complet sur ce point je vais finir sur une dernière notion.

Le contenu de ces "mémoires"
Elle contiennent soit directement des données (Word,DoubleWord simple bytes, ....) soit des pointeurs. Les pointeurs sont des données particulières qui au lieu de vous donner directement une valeur vous donne l'adresse ou la trouver.
2 exemples. Le registre particulier ESP qui contient toujours l'adresse du haut de la PILE (C'est pourquoi la pile est accessible si rapidement, l'adresse est toujours chargé en mémoirer rapide puisqu'il s'agit d'un registre) N'importe quel registre ou presque qui par exemple peut contenir l'adresse ou est stoqué votre UNIT Personnage dont je parle dans le premier post (ou tou autre UNIT(Objet) d'ailleurs)

2) L'ALU (Arithmetic et Logical UNit)

Ce sont les circuits combinatoires qui effectue les opérations arythmétics et logiques (plus, moins, AND, XOR ...)

3) Bus Unit Interface (BIU)

C'est le bus qui charge l'ADDRESSBUS et le DATABUS lors d'acces en memoire (Il gère également les cache de premier et second niveaux)

4) Control Unit et Instruction SET
Il répond à la question comment la CPU assigne les taches aux différents éléments internes mais également à l'extérieur. Rappelez vous pour limiter le nombre de circuit hardware, les instructions de base sont limitées aux minimum= l'instruction SET. Ces instructions sont chargées et données pour execution par le control Unit

Bon il est grand temps de passer à l'assembleur
 
M

Myrdinn

Invité
Quelques notions d'assembleur qui nous permettrons de démarrer le post d'exemple.

Les Registres
Tout d'abord un petit rappel sur les registres et leurs rôles dans DiabloII.
Je ne parlerais pas des registres de structures (Position mémoire de l'instructions à exécuter, pointeur du Segment mémoire en cours ...) mais seulement des registres dont nous parlerons.

LE premier est le registre EAX. Il fait 32 bits. Il a beaucoup de rôle mais le plus important dans DII c'est que toutes les fonctions retourne leur résultat dans EAX. Bref si vous passez la ligne qui va lire le ILVL d'un objet. Vous verrez quand même le résultat en regardant le registre EAX. Il est impliqué par défaut dans beaucoup d'opération mathématique mais nous le verrons en exemple.LE regsitre EAX peut être divisé en 2. La moitié "basse" s'apelle le registre AX qui peut lui même être divisé en 2 bytes AH et AL (Pour registre A Low et High). Il en va de méme pour tout les registres X.

Je ne détaillerais pas les autres regsitres ici seulement quelques notions rapidres.
Il y a 4 "registre X". EAX,EBX,ECX,EDX Dans diablo II il contiennent en général les Données.
Il y a 2 regsitres, EDI et ESI qui généralement contiennent les pointeurs (Unit Joueur, Unit Cible ou attaquante ...)
Ensuite 2 registres sont encore susceptibles de nous intéresser les registre EBP et EDP. Il sont souvent dédiés aux pointeurs mais diablo II les utilisent également pour contenir des Données.
Pour finir avec les registres 32 bits(DWORDs) il ne faut pas oublier ESP qui contient le pointeur de l'adresse de la pile.

Je doit vous parler d'autres "registres". Les Flags (Indicateurs) qui font 1 bit purement Booléen Vrai ou FAux (1 ou 0)
Un exemple le flag register ZERO passe à 1 a chaque fois qu'une opération donne la valeur 0
LE flag Register Sign passe à 1 a chaque opération qui donne un nombre négatif ...
Bon je vais les lister en petit, nous verrons leur utilité plus tard

Overflow
Direction
Interrupt
Trace
Sign
Zero
Auxiliary Carry
Parity
Carry



Je vais donner maintenant les principales instructions uniquement. Au fur et à mesure des exemples et tutoriaux je compléterais directement dans le post les nouvelles instructions et je mettrais à jour ce post en conséquence. Nous allons voir 4 catégories d'instructions.

1) Mouvement de Données.
LA première instructions à connaitre est

MOV Operand A , Operand B
MOV A,B equivaut à A=B ou si vous préférez à copier B dans A
A pouvant être un registre ou une mémoire. B aussi mais B peut être une valeur hexadécimale.
Un exmple MOV EAX,64 charge la valeur décimale 100 dans EAX (64 en hexa font 100)
MOV EBX,DWORD[ESP+04] copie le deuxième DWORD de la pile dans EBX. Celui je l'ai fait exprès, pour vous montrer qu'il existe de très nombreuse variante de MOV. Pas la peine de vous farcir le crane nous verrons les exemples concrets au fur et à mesure.

LEA (Load Effective Address) Fait la même chose que MOV mais à partir d'une addresse mémoire précise (Alors que MOV fait un Displacement, c'est à dire une adresse mémoire relative par rapport au pointeur du DATASegment (Un peu près dans le même genre que mon ESP+04). Pas la peine non plus de vous torturez, on en reparlera ou a la rigueur posé moi la question dans ce post)

LEs 2 dernières PUSH et POP sont de la forme PUSH A, POP A elle font respectivement Copie A en haut de la pile (Indiqué par ESP) et retire A du haut de la pile et modifie ESP en conséquence. A pouvant être une mémoire ou un registre (Dans le cas de Push également une valeur en hexadécimal)

2) LEs opérations Arythmetiques et logiques
Tout simplement en assembleur on peut faire les opérations arythmétiques suivantes:
Addition ADD A,B A=A+B (avec la forme spéciale INC A incerment A soit A=A+1)
Soustraction SUB A,B idem avec DEC B (Pour décremente B=B-1)
Multiplication et Division IMUL A,B et IDIV A,B (Il existe des subtilités que l'on verra le moment venus).

Les opérations logiques dont nous avons déja parler ont leur instructions en assembleur :
AND --> AND A,B
mais également OR, XOR ...

3) Test et comparaison
Très important. Le processeur peut comparer des regsitres, des valeurs. En faite il fait l'équivalent d'un AND,OR ... suivant le test et modifie les Flag Register en conséquence, mais sans toucher les valeurs testées. L'interet? On va le voir tout de suite.
Mais avant des exemples d'instructions. TEST et CMP ...
Un exemple PArticulier TEST EAX,EAX (Ou tout autre du même genre) permet de tester si EAX=0 ? On le rencontrera très souvent.

4) Program Flow Control
Bon comment passe-t-on d'une fonction dans les Dlls à une autre ou d'une partie de programme à une autre?
3 instructions pour l'instant JMP, Jxx CALL.

JMP Adresse de l'instruction. Passe directement à l'adresse pour la prochaine instruction à executer.
Admettons que l'on ai le code suivant (Première colonne- Adresse de l'instruction, 2eme colonne Instruction)
6DF000B4 MOV EAX,64
6DF000B8 JMP 6DF000C9
6DFOOOC1 XOR EAX,EAX
Le programme n'executera pas XOR EAX,EAX. Après avoir avoir fait EAX=100 Il sautera toute les lignes de code jusqu'à la ligne 6DF000C9.

Jxx Ce sont les Jmp Conditionels. Il suivent un Test(ou une comparaison) Puis suivant les FlagRegister le Jmp se fait ou non
Un exmple
CMP EAX,EBX
JGE 6DF000C9
Le processeur compare le registre EBX avec le registre EAX. si EBX >= EAX(Jump is Greater or Equal JGE) alors on continue à l'adresse 6DF000C9 Autrement on ignore le jump)
Je ne ferais pas la liste il sont facile à deviner quelques exemples
JGE Jump If Greater or Equal
JLE Jump if LEss or Equal ...

CALL/RET. C'est l'équivalent d'un Jump sauf que l'adresse actuelle est sauvegardée sur la pile, quand le programme rencontre l'instruction RET il retourne à l'addresse sauvegardé sur la Pile
C'est de cette façon que le jeu appelle une fonction dans une DLL. Le logiciel pour tracer les Dlls que nous utiliserons nous donne même le numéro de la fonction appelée. Un exemple le logiciel vous donnera directement "CALL D2Common - Ordinal Fonction 2917h" suivant les paramètres en entrée c'est cette fonction qui peut vous donner le ILVL.
C'est d'ailleurs comme ca que l'on reconnait la fin d'une fonction, elle se termine toujours par RET (Et c'est d'ailleurs le seul RET de la fonction). Vous comprendrez également qu'une fois que le jeu a calculé le ILVL il faut qu'il continue la ou il en etait d'ou le CALL/RET et non un JMP vers la fonction :)

Bon maintenant il est temps de voir une fonction en Entier (Vous connaisser déjà une instruction de cette fonction elle finie par RET :D )
C'est la fonction qui calcule dans un combat les dégats physiques (De tous le monde, Joueur, monstre, Dame de fer, mercenaire, squelette, golem , shadow master ...) C'est l'objet du troisième sujet Tracer les DLLs -- Exemple Fonction de calcul des dégats physiques

En attendant si vous avez des questions n'hesitez pas
 
T

Tony

Invité
eheh le voila le fameux post que l'on attend ... bon je m'y colle . A tout a l'heure ;)
 
T

Tony

Invité
Très très intéressant, et très claire Myrdinn ! :clap: :clap: :clap:

Si, il était possible d'avoir des liens vers des sites en Français pour approfondir, ce serait super top par ailleurs. On ne tarit pas facilement ma soif de connaissance lol ;) . En fait, je n’ai rien de particulier à ajouter car le tout est très claire. J’attends que le fil se développe donc ;)

Edit : wouhwouh mon 300eme post ;)
 
S

Simon33

Invité
Pour n Variable en entrée il existe 2 a la puissance 2 puissance n Fonctions différentes (Il en existe autant que vous voulez mais au final il ne peut y avoir que 2^2^2n résultats possibles).
  N'y aurait-il pas un 2 sur-numéraire ?

Comme nous l'avons vu on peut tout construire seulement avec des circuits AND OR et NOT. En réalité un seul circuit suffit c'est le circuit NAND(Fonction F7)
  Même que je m'étais amusé à réaliser heuristiquement (c'est-à-dire en câblant un peu aléatoirement, en connaissant uniquement ce que je voulais en sortie) les 6 fonctions suivantes avec des portes NAND en 5ème (année où j'ai découvert en technologie l'électronique numérique) :
- a AND b = (a NAND b) NAND (a NAND b) -> 2 portes NAND;
- a NAND b = a NAND b (sans blague !) -> 1 porte NAND;
- a OR b = (a NAND a) NAND (b NAND b) -> 3 portes NAND;
- a NOR b = (a OR b) NAND (a OR b) (remplacer les OR par ce qu'il y a ci-dessus) -> 4 portes NAND ;
- a XOR b = [(a NAND a) NAND b] NAND [a NAND (b NAND b)] -> 5 portes NAND ;
- a NXOR b = (a XOR b) NAND (a XOR b) (remplacer les XOR par ce qu'il y a ci-dessus) -> 6 portes NAND .

J'ai pu tout faire de mémoire, puisqu'il s'agissait de portes logiques câblées, et il m'est beaucoup plus facile de me souvenir de petits dessins que j'ai moi-même réalisés en me cresant la tête (même après 9 ans ... je m'épate moi-même !!!) que de formules alambiquées comme celles que j'ai données.

Si je trouve un scanner, je vous fais les petits dessins ...

Quoi qu'il en soit, Myrdinn Sensei, bravo pour ton magnifique boulot !
J'en ai même mis à jour mon 'anthologie' ...


@++
 
M

Myrdinn

Invité
J'ai réécrit la suite hier chez moi pour alléger mon laius. Je contais le poster ce matin mais pas de chance ma disquette est morte. Bref la suite complète ce soir.

Exact Simon il y a un 2 de trop (faute de frappe désolé je vais éditer) Sinon ne t'inquiètes pas j'ai fait la démonstration complète et j'ai mis les images qui explique les circuits electriques ainsi que la démonstration mathématique qui explique comment faire de OR NOT et AND avec des NAND. Donc à ce soir pour la suite sauf si je trouve un poste au boulot capable de lire ma disquette :(
 
M

Myrdinn

Invité
J'ai réussi à récupérer une grande partie de mes fichiers. Bon je les mets en vrac, j'aurais besoin de les éditer pour au moins corriger les fautes d'orthographe.
Malheureusement je n'ai pas récupéré une version correcte pour la partie Instruction SET, j'essayerais cet après midi ou ce soir :D
 
T

Tony

Invité
oups j'avais pas vu qu'il y avait de la nouveauté ... J'y retourne !
 
M

Myrdinn

Invité
Bon voila j'ai terminé mon blabla.
Maintenant il est temps de passer à l'action. Rendez vous pour le prochain post dès ce jour si je trouve le temps :D
 
B

BoulaTheBoula

Invité
j ai pas encore lu (because a pas le temps la ) mais sa ressemble a mon cours d electronique :p

je le lis des que je peux et je donne mon avis

encore merci myrdinn
 
E

elemak

Invité
salut.
J ai deux questions concernant ce post. (J en aurais peut-etre d autres, j ai pas tout lu).

Je cite:
p5) Identité. Une valeur booléene I est un élément d'identité pour un opérateur x donné si AxI=A

ok, mais apres, on trouve: P2) L'identité pour AND et OR est 0, ce qui voudrait donc dire A AND 0=A



:confused:


mais non, A AND 0=0 (d'ailleurs tu l'ecris th5) Par contre A AND 1=A (th4), c donc 1 qui est l identite de AND, je pense....
corrige moi si je me trompe..

deuxieme point:

tu dis: Th9) A OR A AND B = A
hem, la je comprends pas. est ce que c pas une erreur?
t as pas voulu ecrire A OR (A AND B)=A plutôt?


Si tu pouvais me confirmer ou m'expliquer comment tu arrives a ces resultats.......
 
A

arkadin

Invité
je vais prendre une aspirine et je vais m'y mettre mon avis ds 1 heure :)


[edit] première lecture: très interressant :) ms put1 que c compliqué :) je crois que ça ira mieux a la 2° lecture ms je vais lire le premier post d'abord :) je trouve ces post vraiment très interressant pour comprendre le fonctionnement interne de nos pc :) car la plupart des livres pour pc traite de l'ext ou alors ceux qui traite de son fonctionement interne sont :o :o enfin vs voyez :)


en tt cas un grand merci pour tt le travail que tu fais pour le forum
 
M

Myrdinn

Invité
Provient du message de elemak
salut.
J ai deux questions concernant ce post. (J en aurais peut-etre d autres, j ai pas tout lu).

Tu es le bienvenu :D Je me demandais si quelqu'un avait lu ce post :lol:

Je cite:
p5) Identité. Une valeur booléene I est un élément d'identité pour un opérateur x donné si AxI=A

ok, mais apres, on trouve: P2) L'identité pour AND et OR est 0, ce qui voudrait donc dire A AND 0=A

:confused:


mais non, A AND 0=0 (d'ailleurs tu l'ecris th5) Par contre A AND 1=A (th4), c donc 1 qui est l identite de AND, je pense....
corrige moi si je me trompe..

Effectivement j'ai bouffé une partie de ma phrase quand j'ai écrit le post la vrai phrase étant effectivement

L'identité est 1 pour AND et pour OR c'est 0, NOT n'a pas d'identité.


deuxieme point:

tu dis: Th9) A OR A AND B = A
hem, la je comprends pas. est ce que c pas une erreur?
t as pas voulu ecrire A OR (A AND B)=A plutôt?


Si tu pouvais me confirmer ou m'expliquer comment tu arrives a ces resultats.......
Hum il faut que je vérifie pour cette partie effectivement c'est A OR (A AND B) =A . J'ai écrit sans le paranthèse car AND (x) est prioritaire sur OR (+) . J4ai quand même édité pour éviter toutes confusions.
Bon sans démonstration envisageons les 2 cas possibles.
A=B
A AND B <=> A AND A=A
Donc le théorème est équivalent à A OR A =A

A=NOTB (A<>B)
A AND B <=> A AND NOTA=0
Donc le théorème est équivalent à A OR 0 =A.
Car 0 est l'identité de OR :rolleyes:

Merci d'avoir lu, tes questions sont les bienvenues, je suis très loin d'être infaillible.
 
B

Beden

Invité
heyhey mes bon vieux cours de génie électrique avec les chip et les porte et , ou, etc
 
C

chaostar

Invité
[citation=1971646,0,16][nom]Beden a écrit[/nom]heyhey mes bon vieux cours de génie électrique avec les chip et les porte et , ou, etc[/citation]

Oué, mes bons vieux cours d'architecture des ordinateurs et d'assembleurs qui me reviennent en mémoire grace a Myrdinn, si c'est pas beau :p
 
N

niursz

Invité
plop

je n y connais rien en electronique/informatique, mais apres avoir parcouru ces posts, j ai l impression que le systeme ressemble beaucoup au principe des ensembles, avec or=union, and=intersection, et not=ensemble opposé, à ceci pres qu il n y a que deux ensembles, l ensemble contenant 1 et l ensemble nul

sinon, je n ai pas compris le pourquoi du 2^2^n. n= le nombre de variables, c est ça? peux tu expliquer la provenance de ce nombre de fonctions, stp? :)

apres le premier post, j ai laché prise, je re plus tard pour finir la lecture ;)
 
Haut