Sommaire

ASMBOOK

Je me fais cette aide pour moi même et comme "la connaissance s'accroît quand on la partage" (jc Bellamy) , comme c'est grâce a de nombreux exemples et tutoriels d'autres personnes (code source entre autre, www.asmfr.com) que j'avance dans la compréhension de l'asm du PC, c'est tout naturellement que je partage cette aide. Vos remarques constructives sont les bienvenues. En espérant avoir du temps pour faire évoluer ce projet, car j'aimerais bien regrouper en Français un maximum d'informations. De plus j'essaye de rendre accessible aux débutants la compréhension de l'asm.

Important:
Dans un premier temps certaines parties de l'aide peuvent-être des copier coller de divers horizons, dans la mesure du possible j'essaye de notifier les auteurs respectifs d'origine, puis je m'efforce de réécrire un maximum les informations récoltées, le but est de réunir l'informations, pas de mettre a mon compte le travail d'autrui.
Je ne suis pas un pro de l'orthographe et je m'en excuse, de plus je peux me tromper dans ce que j'avance ou je crois avoir compris...

Le travail à effectuer pour que cette aide soit vraiment utile est énorme, c'est pourquoi je l'ai mise dès maintenant sur www.asmfr.com ,car je suis ouvert à toute collaboration si ce projet intéresse quelqu'un , il est évident que dans ce cas je notifierais tous les participants.

Participants à la création de cette aide et remerciements:

D'abord merci à www.asmfr.com .
BruNews (La partie Fpu, et ses remarques utiles)
Babasse (Initiateur de ce projet)

Utilisation:
Dans la mesure du possible les pages non finalisées (partiellement traduite ou incomplète) seront indiquées par la présence d'un astérisque* à la fin du titre, ou bien notifié par la dépose d'un tranche de jambon sur l'écran que vous pouvez dors et déja installer car aucune page n'est définitive, tout peux évoluer l'univers est en mouvement (nd:jcv). L'utilisation de cette aide est à vos risques et périls et nous ne saurions être tenue responsable de rien, pas même d'un ongle cassé.

Documentations utilisés:
Win32.hlp
Visual Basic Research Center - http://docvb.free.fr

Aucun animal n'a été maltraité pendant la réalisation des cascades...


ComprendreProc

Assembleur x86

Le language assembleur est propre a chaque processeur. La programmation du 68000 Motorola par exemple est différente même si l'on retrouve de nombreuses similitude avec le 8086 d'Intel.Pour pouvoir programmer en assembleur il est très important de savoir a qui on s'adresse. Parcontre les similitudes sont accrues lorsque l'on est dans la même famille de processeur, le 8086 et le 80386 par exemple, puisque l'un puise sont origine de conception dans l'autre et que dans ce cas de figure la compatibilitée ascendante est assurée, un programme écrit pour le 8086 fonctionne sur le 80386.(attention ne pas confondre la compatibilitée au niveau processeur et celle du systeme d'exploitation).

Un processeur, en tout les cas celui qui nous concerne ne comprend que des données binaires (des 1 ou des 0) qui correspondent en fait a un état physique, on dit d'un bit qu'il est a l'état haut lorsqu'il est à 1. Cette successions de données peuvent représenter une images par exemples ou pourquoi pas un son, mais aussi un programme executable. Si l'on regarde n'importe qu'elle programme executable telle qu'il est en mémoire lors de son execution, nous serions devant une succession de valeurs numériques compréhensible pour le processeur que l'on appel language machine. Le language assembleur permet de coder ce language machine à travers des instructions plus facilement compréhensible par l'homme.

Par exemple pour mettre la valeur 02h dans le registre Ax, il nous faudrait écrire en language machine B80200h ce qui n'est franchement pas évident pour le commun des mortels... Via l'assembleur il va nous suffir d'écrire mov Ax,02h ;met/déplace dans le registre ax la valeur de 2 noté en hexadécimal ce qui est déja plus parlant, puis de faire appel a un compilateur assembleur qui va convertir en language machine ces instructions IDENTIQUES mais humanisé.

Maintenant mov ax,02h c'est pas non plus le language que j'utiliserais pour allez prendre un café et pour apprendre l'assembleur en partant de rien il faut du courage, être logique et savoir trouver l'information quand on en a besoin, beaucoup cherche a apprendre ce language pour "cracker", chacun fait ce qu'il veux mais n'attendez pas de moi de l'aide pour ça... Très franchement c'est pas le language que je conseillerais d'apprendre car en programmation l'avantage va nettement au C et ses dérivés, vous trouverez donc plus facilement l'information pour le C avec des exemples en C etC... Et sans compter tous les languages "de script" ou dérivé qui facilite grandement le boulot avec de plus en plus de programmes "en ligne" ou interfacer via un navigateur.

Vous êtes toujours là ? Alors vous devez avoir une bonne raison de vouloir en savoir plus sur ce language et vous êtes tenace quand même !!!


Analogie1

Analogie de fonctionnement du processeur : *
Si vous trouvé des erreurs merci de me le signaler. Le texte qui suit est une suite de métaphores dont le but est d'aider la compréhension du fonctionnement du processeur, tâche pas franchement facile. Toute ressemblance avec des personnes ayant existées ne serait que pure coïncidence.

Quand on débute ce n'est pas simple de comprendre de quoi il s'agit, alors je vais tenter de faire une analogie pour essayé de faire comprendre comment ça marche...

Faite travailler votre imagination et dite vous que votre nouveau travail s'appel "Pentium", votre Bureau s'appel processeur et vous êtes dans ce bureau. Devant vous des boites à trous. Prenons la première boite que l'on va appeler A, la boite A contient 8 trous (8bits) que l'on peut remplir avec des balles pour noter donc 2 états possible pour chaque trous. Soit le trou est vide, soit il contient une balle.

Comme notre boite contient 8 trous ça nous donne 28 valeurs possible (256) pour cette boite de 8 trous, seulement comme vous êtes un pentium la boite A héritage d'un passé lointain a subit quelques modifications depuis un certain temps déjà...

Vos prédécesseurs on eu besoin d'utiliser des nombres supérieurs a 256 et on eu l'idée de coller un bloc de 8 trous supplémentaires à la gauche de notre chère boite A, pour notifier ce changement ils ont eu l'idée de renommer la boite A en Ax pour A eXtended, comprenez A étendue et en prime ils se sont dis on va dans la foulée appeler la partie basse ( à droite) AL pour A Low et la partie haute à gauche (l'extension) AH pour A High. Cette évolution à 16 trous(16 bits) permet maintenant de notifier des valeurs allant jusqu'à 216 soit 65536 valeurs possible.

AX
AX ci dessus, à votre gauche AH et à droite AL, AH contient 8 Trous et AL 8 aussi , l'ensemble AX contient donc 16 trous
Comme vous êtes un professionnel et que vous savez compter avec des trous vous allez être capable d'inscrire le nombre 1048 dans cette boite(AX) avec un jeu de balles (bits valent 1) qui rentre dans ces trous. Ceci nous donne:

32768|16384|8192|4096|2048|1024|512|256|128|64|32|16|8|4|2|1
En fait le trou le plus a droite vaux 1 lorsqu'il est occupé, le trou juste a sa droite le double etc... Comme indiqué ci dessus et avec cette ensemble de valeurs il est possible de noter n'importe quelle valeur comprise entre 0 (que des trou) et 65535 que des balles dans tous les trous (que des 1). On a eu besoin de noter dans notre boite 1048 pour trouver quels trous ou bits doivent passer à 1 il suffit de mettre à 1 le trous dont la valeur est égal ou immédiatement inférieur de soustraire cette valeur au chiffre a noter et de continuer avec le reste de cette soustraction. Pour 1048 le onzième trou vaut 1024 il nous reste 24 le cinquième trou vaut 16 il nous reste 8 , le quatrième vaut 4 il nous reste rien, soit 1024 + 16 + 8 = 1048 Si vous ne comprenez pas prenez un peu de temps, une feuille de papier et reprenez tout ça car c'est assez important de bien comprendre. Comme on a eu besoin d'utiliser des chiffres encore plus grand on a coller à nouveau un bloc supplémentaire de trous et cette fois on à coller 16 trous de plus et renommer l'ensemble EAX à gauche des 16 qui composent AX. Simple non ? (E pour enhanced je pense mais je ne suis pas sur?)

Cette boite fait partie des registres Généraux. vous avez donc une armoire que l'on va appelé registre dans laquelle une étagère s'appelle registre généraux et se compose des cases EAX, EBX, ECX, EDX. Dans cette armoire il y'a d'autres étagères composées d'autres registres mais on y reviendra plus tard...
A côté de votre armoire il y'a une salle des archives remplient d'étagères bien étiquetées, cette salle c'est la mémoire vive de votre ordinateur, la RAM (elle n'est pas dans votre bureau processeur mais a côté, pour info vous y avez accès par un couloir que l'on appel le bus).On reviendra régulièrement sur cette salle appelé RAM.

On va continuer notre analogie et vous expliquer un peu plus comment fonctionne votre travail. Vous avez l'âme musicale ça tombe bien car votre travail est cadencé en rythme, ce rythme c'est une horloge qui vous le donne, l'horloge du processeur, celle qui tourne aujourd'hui à une vitesse vertigineuse plusieurs Giga hertz !!!
A chaque coup d'horloge, vous effectuez une action, certaines taches vous prendrons plusieurs coups d'horloge, par exemple pour faire une multiplication il vous en faudra un certain nombre, ce qu'il faut savoir c'est que chaque processeur a des caractéristiques propre a ce niveau là, un 386 prend n coup d'horloge pour faire une division par exemple, pour savoir précisément il suffit de se reporter a des tableaux contenant le nombre de cycles par instructions pour tel ou tel processeur, documentation Intel par exemple trouvable sur le net. Maintenant comment savez vous ce que vous avez à faire ?

On à dis que la RAM c'est une salle bourrée d'étagères et très bien étiquetés. Il est évident que c'est vous qui allez charger en RAM le programme a exécuter, vous allez devoir trouver une étagère libre pour stocker le programme en RAM. Comme votre travail est très bien organisé vous allez renseigner une fiche sur laquelle vous inscrivez l'adresse de chaque parties du programme que vous venez de charger. Dans un programme exécutable il y'a la section qui contient le code, c'est à dire les instructions que vous allez devoir faire pour que le programme ressemble a ce pour quoi il a été conçu. Cette section est la section .code ou CS pour code segment, ça tombe bien sur votre fiche il y'a un champ CS dans lequel vous avez pris soin de noter l'adresse ou débute cette section. Dans la foulée vous avez renseigné un autre registre appelé IP, Instruction Pointer (pointeur d'instruction), ce registre pointe toujours sur l'instruction suivante a exécuter. Comme vous allez devoir exécuter ce programme il vous suffis de regarder l'instruction qui se trouve a l'adresse contenu dans IP et de suivre l'instruction contenu a cette adresse, en ayant pris soin de mettre a jour IP juste avant pour savoir ou vous en êtes.

(Je rappel qu'il s'agit d'une analogie du fonctionnement processeur)

Résumé: on a vu les registres généraux Ax, Bx, Cx, Dx puis CS et IP et l'on sait que l'on est cadencé par une horloge et qu'on a un temps prédéfinis pour réaliser chaque instruction.

Bon, on a bien avancé mais il reste encore pas mal de chose, mettons que la première instruction que vous ayez à faire soit Mov ah,10 Vous allez donc devoir remplir(boite à balles) le registre Ah pour que sa valeur soit de 10, ce que vous faite dans un temps appartis. Une fois fait vous allez devoir mettre a jour un autre registre appelé Flag (drapeaux) ce registre sert à noter les particularités que vous venez de rencontrer. Par exemple si vous faite une addition et que le résultat loge pas dans votre boite a balle c'est dans ce registre que vous allez prévenir de cette état de fait, de plus la prochaine instruction peut vous demander si il y'a eu un dépassement alors la vous vous dite facile j'ai juste a regarder dans la boite de flag et si le bit(la balle) indiquant le dépassement(overflow) est là, alors je sais que oui. Une bonne boite pense bète cette boite à Flags! Mais un autre truc peux se passer, on peux vous interrompre !!! Les interruptions peuvent-être matériel ou logiciel, les interruptions matériels sont relayées par un de vos collègues qui s'appel le contrôleur d'interruption programmable, lui il s'occupe de surveiller la souris par exemple, dès qu'elle bouge, il nous prévient et nous propose de nous donner les nouvelles coordonnées de la souris et l'état de ses boutons.

Résumé: Donc avant d'exécuter une instruction le processeur regarde si il y'a une interruption prioritaire a traiter sinon, on va chercher l'instruction a exécuter à l'adresse que nous donne Ip, et lorsqu'il a finis l' instruction qu'il a trouvé a cette adresse il met a jour les flags et recommence. On oublie pas que l'horloge cadence son travail et que lorsque qu'il va chercher l'instruction il sait qu'il à n coup d'horloge pour faire le travail indiqué.

Un programme informatique c'est une suite d'instructions certes mais il me semble difficile de prévoir l'ordre exact de son déroulement, en effet on ne sait pas à l'avance ce que fera l'utilisateur par exemple. C'est entre autre pour cela qu'un programme est remplit de branchements de sauts etc... Par exemple on pourrais tester EAX et si il est a une autre valeur que 0 sauter vers un bloc d'instructions (procédure) une fois ces instructions exécutées revenir à l'instruction suivante. C'est au passage ce que l'on appel un saut conditionnel, un saut que l'on fait si la condition est remplie. Mais j'imagine que la plupart d'entre vous sont familiarisé avec les boucles et branchements, ainsi que l'organisation générale d'un programme.

La suite le plus tôt possible j'espère...


Les instructions*

Classées par ordre Alphabétique A B C D E H I J L M N O P R S T V W X
Classées par catégories

Le jeu d'instruction ...

AAA - Ascii Adjust for Addition
AAD - Ascii Adjust for Division
AAM - Ascii Adjust for Multiplication
AAS - Ascii Adjust for Subtraction
ADC - Add With Carry
ADD - Arithmetic Addition
AND - Logical And
ARPL - Adjusted Requested Privilege Level of Selector (286+ PM)
A B C D E H I J L M N O P R S T V W X
 BOUND - Array Index Bound Check (80188+)
BSF - Bit Scan Forward (386+)
BSR - Bit Scan Reverse (386+)
BSWAP - Byte Swap (486+)
BT - Bit Test (386+)
BTC - Bit Test with Compliment (386+)
BTR - Bit Test with Reset (386+)
BTS - Bit Test and Set (386+)
A B C D E H I J L M N O P R S T V W X
CALL - Pour faire appelle à une procédure
CBW - Convert Byte to Word
CDQ - Convert Double to Quad (386+)
CLC - Clear Carry
CLD - Clear Direction Flag
CLI - Clear Interrupt Flag (disable)
CLTS - Clear Task Switched Flag (286+ privileged)
CMC - Complement Carry Flag
CMP - Compare
CMPS - Compare String (Byte, Word or Doubleword)
CMPXCHG - Compare and Exchange
CWD - Convert Word to Doubleword
CWDE - Convert Word to Extended Doubleword (386+)
A B C D E H I J L M N O P R S T V W X
DAA - Decimal Adjust for Addition
DAS - Decimal Adjust for Subtraction
DEC - Decrement
DIV - Divide
A B C D E H I J L M N O P R S T V W X
ENTER - Make Stack Frame (80188+)
ESC - Escape

HLT - Halt CPU
A B C D E H I J L M N O P R S T V W X
IDIV - Signed Integer Division
IMUL - Signed Multiply
IN - Input Byte or Word From Port
INC - Incremente
INS - Chargement d'une chaine de caractère depuis un Port (80188+)
INT - Interruption
INTO - Interruption si dépassement (Overflow)
INVD - Invalidate Cache (486+)
INVLPG - Invalidate Translation Look-Aside Buffer Entry (486+)
IRET/IRETD - Retour d'interruption
 A B C D E H I J L M N O P R S T V W X
Jxx - Sauts conditionnels
JCXZ/JECXZ - Jump if Register (E)CX is Zero
JMP - Saut
A B C D E H I J L M N O P R S T V W X
LAHF - Load Register AH From Flags
LAR - Load Access Rights (286+ protected)
LDS - Load Pointer Using DS
LEA - Load Effective Address
LEAVE - Restore Stack for Procedure Exit (80188+)
LES - Load Pointer Using ES
LFS - Load Pointer Using FS (386+)
LGDT - Load Global Descriptor Table (286+ privileged)
LGS - Load Pointer Using GS (386+)
LIDT - Load Interrupt Descriptor Table (286+ privileged)
LLDT - Load Local Descriptor Table (286+ privileged)
LMSW - Load Machine Status Word (286+ privileged)
LOCK - Lock Bus
LODS - Load String (Byte, Word or Double)
LOOP - Decrement CX and Loop if CX Not Zero
LOOPE/LOOPZ - Loop While Equal / Loop While Zero
LOOPNZ/LOOPNE - Loop While Not Zero / Loop While Not Equal
LSL - Load Segment Limit (286+ protected)
LSS - Load Pointer Using SS (386+)
LTR - Load Task Register (286+ privileged)
A B C D E H I J L M N O P R S T V W X
MOV - Déplacement d'integer ou de mot (Word)
MOVS - Move String (Byte or Word)
MOVSX - Move with Sign Extend (386+)
MOVZX - Move with Zero Extend (386+)
MUL - Multiplication sur des entiers
A B C D E H I J L M N O P R S T V W X
NEG - Two's Complement Negation
NOP - Ne fait rien (90h)
NOT - One's Compliment Negation (Logical NOT)

OR - Fonction logique OU
OUT - Sortie sur un port.
OUTS - Sortie d'une chaine de caractères sur un Port (80188+)
A B C D E H I J L M N O P R S T V W X
POP - Dépile
POPA/POPAD - Dépile tous les registres (80188+)
POPF/POPFD - Pop Flags off Stack
PUSH - Empile
PUSHA/PUSHAD - Empile tous les registres (80188+)
PUSHF/PUSHFD - Push Flags onto Stack
A B C D E H I J L M N O P R S T V W X
RCL - Rotate Through Carry Left
RCR - Rotate Through Carry Right
REP - Repète une opération de manipulation de chaine
REPE/REPZ - Repeat Equal / Repeat Zero
REPNE/REPNZ - Repeat Not Equal / Repeat Not Zero
RET/RETF - Return From Procedure
ROL - Rotation de bit à gauche
ROR - Rotation de bit à droite
 A B C D E H I J L M N O P R S T V W X
SAHF - Store AH Register into FLAGS
SAL/SHL - Shift Arithmetic Left / Shift Logical Left
SAR - Shift Arithmetic Right
SBB - Subtract with Borrow/Carry
SCAS - Scan String (Byte, Word or Doubleword)
SETAE/SETNB - Set if Above or Equal / Set if Not Below (386+)
SETB/SETNAE - Set if Below / Set if Not Above or Equal (386+)
SETBE/SETNA - Set if Below or Equal / Set if Not Above (386+)
SETE/SETZ - Set if Equal / Set if Zero (386+)
SETNE/SETNZ - Set if Not Equal / Set if Not Zero (386+)
SETL/SETNGE - Set if Less / Set if Not Greater or Equal (386+)
SETGE/SETNL - Set if Greater or Equal / Set if Not Less (386+)
SETLE/SETNG - Set if Less or Equal / Set if Not greater or Equal
SETG/SETNLE - Set if Greater / Set if Not Less or Equal (386+)
SETS - Set if Signed (386+)
SETNS - Set if Not Signed (386+)
SETC - Set if Carry (386+)
SETNC - Set if Not Carry (386+)
SETO - Set if Overflow (386+)
SETNO - Set if Not Overflow (386+)
SETP/SETPE - Set if Parity / Set if Parity Even (386+)
SETNP/SETPO - Set if No Parity / Set if Parity Odd (386+)
SGDT - Store Global Descriptor Table (286+ privileged)
SIDT - Store Interrupt Descriptor Table (286+ privileged)
SHL - Déplacement de bits à gauche
SHR - Déplacement de bits à droite
SHLD/SHRD - Déplacement en double précision (386+)
SLDT - Store Local Descriptor Table (286+ privileged)
SMSW - Store Machine Status Word (286+ privileged)
STC - Met le bit Carry (CF) à l'état haut (1)
STD - Met le bit Direction (DF) à l'état haut (1)
STI - Set Interrupt Flag (Enable Interrupts)
STOS - Store String (Byte, Word or Doubleword)
STR - Store Task Register (286+ privileged)
SUB - Soustraction
A B C D E H I J L M N O P R S T V W X
TEST - Test For Bit Pattern
A B C D E H I J L M N O P R S T V W X
VERR - Verify Read (286+ protected)
VERW - Verify Write (286+ protected)
 A B C D E H I J L M N O P R S T V W X
WAIT/FWAIT - Attendre
WBINVD - Write-Back and Invalidate Cache (486+)
 A B C D E H I J L M N O P R S T V W X
XCHG - Echange
XLAT/XLATB - Translate
XOR - OU Exclusif

Classement par catégories

Instructions de Pile
POP - POPA/POPAD - POPF/POPFD -PUSH - PUSHA/PUSHAD - PUSHF/PUSHFD

Instructions Arithmétique

Instruction de Chaine


Les Registres*

Cette partie est très importante pour la bonne compréhension de l'assembleur, si vous êtes débutant des analogies très simples sont utilisées pour vous aidé a comprendre et tout d'un coup vous allez trouver les parties qui vous paraissent indigeste au départ, très utiles et facile à comprendre.
Le processeur est composé de différentes parties. Les registres sont souvent représentés comme des cases dans lesquelles sont stockées différentes valeurs de différentes tailles selon le type et le nom du registre. Il existe plusieurs types de registres avec pour chacun leurs particularités et utilités propre. Vu d'ensemble:

Les registres Généraux:
 Nous avons plusieurs registres dit généraux (de travail) A,B,C et D. Considérons ces registres comme des registre 8 bits à l'origine, l'évolution des processeurs à amener ceux-ci à travailler en 16 Bits puis 32 Bits et on parle déjà de l'évolution en 64 Bits.
Pour ne pas renommer ces registres 8 Bits on les a tout simplement fait évolué eux aussi dans leur dénomination, et l'on parle alors d'AX pour l'adressage en 16 BitsX pour eXtended.
 Lors du passage en 32 Bits des processeurs un "E" à été rajouter devant le nom des registres, E pour enhanced (étendue).Ce qui fait que pour utiliser toute l'étendu du registre AX par exemple, nous nommerons celui-ci EAX.
AX, peut donc contenir une valeur de 16 Bits, Pour évoquer sa partie Basse de 8 Bits, on notifie le registre sous le nom de AL, L pour Low (basse) et pour évoquer sa partie haute on parle de AH, H pour Hight(haute). Rien ne vaux un exemple:
Soit le Nombre décimal 1048 par exemple ce qui nous donne en binaire 10000011000
100 | 00011000
AH AL
Dans AL nous avons donc les 8 Bits les plus à droite ce qui nous donne 00011000 soit 11000
Dans AH nous avons les 8 Bits les Plus à gauche soit 100
Si vous avez du mal à comprendre, je vous renvois vers l'analogie de fonctionnement du processeur.

La partie haute d'un registre 32 bits, n'est pas directement accessible, on doit utiliser différentes instructions afin de la faire "descendre" dans un registre de 16 bits pour pouvoir finalement l'utiliser. Ax est vraiment très sollicité. Les api Windows renvois leur valeur de retour dans ce registre.

Nous avons ensuite BX (BL et BH), CX (CL et CH) et DX (DL et DH), ces registres sont divisés comme AX en 2 parties hautes et basses.

(la suite est un copier coller pour le moment, origine Falcon)

b ) Les registres pointeurs ou d’offset

Pour terminer, je vais parler des registres pointeurs qui sont DI (destination index), SI (source index), BP (base pointer), IP (instruction pointer) et SP (stack pointer).

Ces registres peuvent eux aussi être étendus à 32 bits en rajoutant un "E" (EDI,ESI,EIP,ESP,EBP).

Ces registres n'ont pas de partie 8 bits, il n'y a pas de EDL ou de ESH.

- SI est appelé « Source Index ». Ce registre de 16 bits est principalement utilisé lors d’opérations sur des chaînes de caractères ; il est associé au registre de segment DS.

- DI est appelé « destination Index ». Ce registre de 16 bits est principalement utilisé lors d’opérations sur des chaînes de caractères ; il est normalement associé au registre de segment DS ; dans le cas de manipulation de chaînes de caractères, il sera associé à ES.

- BP ou « Base Pointer ». Ce registre de 16 bits est associé au registre de segment SS (SS :BP) pour accéder aux données de la pile lors d’appels de sous-programmes (CALL).

- SP ou « Stack Pointer ». Ce registre de 16 bits est associé au registre de segment SS (SS :SP) pour indiquer le dernier élément de la pile.

- IP est appelé « Instruction Pointer ». Ce registre de 16 bits est associé au registre de segment CS (CS :IP) pour indiquer la prochaine instruction à exécuter. Ce registre ne pourra jamais être modifié directement ; il sera modifié indirectement par les instructions de saut, par les sous-programmes et par les interruptions.

Les registres SI et DI sont le plus souvent employés pour les instructions de chaîne et pour accéder à des blocs en mémoire.

Ces registres (sauf IP) peuvent apparaître comme des opérandes dans toutes les opérations arithmétiques et logiques sur 16 bits.

c ) Le processeur et ses registres de segment

Pour pouvoir chercher et placer des choses dans sa mémoire, un ordinateur a besoin de ce qu'on appelle une adresse. Celle-ci se compose de deux parties de 32 bits (ou 16 bits, cela dépend du mode employé). La première est le segment et la deuxième, l'offset.

Voici un exemple :

0A000h:00000h (adresse de la mémoire vidéo)

Dans cet exemple, il s'agit d'un adressage 16 bits. L'adressage 16 bits s'utilise en mode _réel_. Le mode réel est un état du processeur où il ne peut accéder à des blocs de taille supérieure à 16 bits (65536 bytes). Le 286 introduira un mode dit protégé qui permet de franchir cette barrière pour pouvoir accéder à quasiment tout la RAM en un bloc (ce mode protégé sera grandement amélioré à partir du 386).

Nous nous contenterons du mode réel au début, car il est plus simple mais il présente tout de même des limites. Sur 386, les segments ont été conservés pour garder une certaine comptabilité avec les vieilles générations de PC.

Les registres de segment ne sont que lus et écris sur 16 bits. Le 386 utilise un offset de 32 bits (sauf en mode réel où il travaille toujours en 16 bits). Voici la liste de ces segments, ils sont au nombre de 6 :

- CS (code segment) = segment de code

Ce registre indique l’adresse du début des instructions d’un programme ou d’une sous-routine

- SS (stack segment) = segment de pile

Il pointe sur une zone appelée la pile. Le fonctionnement de cette pile seront expliqués au chapitre 3.

- DS (data segment) = Segment de données

Ce registre contient l’adresse du début des données de vos programmes. Si votre programme utilise plusieurs segments de données, cette valeur devra être modifié durant son exécution.

- ES (extra segment) = Extra segment

Ce registre est utilisé, par défaut, par certaines instructions de copie de bloc. En dehors de ces instructions, le programmeur est libre de l’utiliser comme il l’entend.

- FS (extra segment - seulement à partir du 386) = segment supplémentaire

- GS (extra segment - seulement à partir du 386) = segment supplémentaire

Ces deux derniers registres ont un rôle fort similaire à celui du segment ES

Les drapeaux (Flag)

Le registre FLAG ou registre d'état en bon français est en ensemble de 16 bits qui visiblement a été étendu à 32 puisque l'on trouve RF et VM au dela du bit 15. La valeur représentée par ce nombre n’a aucune signification en tant qu’ensemble : ce registre est manipulé bit par bit, certains d’entre eux influenceront le comportement du programme. Les bits de ce registres sont appelés « indicateurs ».

Les instructions arithmétiques, logiques et de comparaison modifient la valeur des indicateurs, pour savoir quel flag modifie une instruction il suffit de regarder dans la description de celle-ci.

Les instructions conditionnelles testent la valeur des indicateurs et agissent en fonction du résultat.


Les flags*

Bit | Nom | anglais | français | Notes
0 | CF | Carry | Retenue | Mis à 1 si retenue
1 | 1 |  |  |
2 | PF | Parity | Parité | Mis à 1 si nombre pair de bit à 1
3 | 0 |  |  |
4 | AF |  | Retenue auxiliaire |
5 | 0 |  |  |
6 | ZF | Zero Flag | Zéro | 1 si egal à 0 ou null
7 | SF | Sign Flag | Signe |
8 | TF | Trap Flag | Traçage déboguage, execution pas à pas | 1 si mode trace
9 | IF | Interrupt Flag | Interruptions | 1 si les interruption sont permises.
10 | DF | Direction Flag | Sens direction | 0 incrémentation 1 décrementation
11 | OF | Overflow | Débordement | 1 si débordement
12 |  |  |  |
13 | IOPL | I/O privilège level | Privilège d'entrée/sortie | "J'imagine qu'il passe à 1 lors d'un échange"
14 | NT | Nested tag flag |  |
15 | 0 |  |  |
16 | RF | Resume Flag | Mode resume |
17 | VM | Virtual Mode flag | Mode virtuel |


Les interruptions*

Les interruptions sont en quelque sorte des sous programmes inclus dans le Bios que l'on peut appeler via l'instruction int suivis du code de l'interruption. La table d'interruption est codé sur 8 bits (255 interruptions).

En gros on passe dans les registres signifiants les paramètres requis.
On appelle l'interruption

N° | Description rapide
00h | Division par 0
01h | Mode Trace (execution pas à pas)
02h | Interruption non masquable
03h | Breakpoint Point d'arrêt lors de l'execution d'un programme
04h | Overflow Erreur de dépassement
05h | Impression de l'écran
06h | Instruction invalide
07h | Pas de coprocesseur présent
08h | Horloge 18,2 Clics par seconde
09h | irq1 Donnée clavier disponible.
0Ah | irq2
0Bh | irq 3 Port Com2
0Ch | irq 4 Port Com1
0Dh | irq 5
0Eh | irq 6 (controleur de disquette)
0Fh | irq 7 (LPT 1)
10h | Vidéo Mode
11h | Liste de Configuration PCI
12h | Taille de la mémoire basse
13h | Gestion des disques
14h | Gestion de l'interface série
15h | Manette de jeux
16h | Gestion du clavier (présence d'une touche et lecture)
17h | Gestion de l'imprimante
18h | Rom Basic
19h | Routine de chargement du dos
1Ah | Heure du bios et fonctions sonores
1Bh | Surveille la combinaison de touche Ctrl + C
1Ch | Chronomètre
1Dh | Table d'initialisation vidéo
1Eh | Table paramètres disquette
1Fh | Table des caractères graphiques et fonction bios password etc....
20h | Fin de programme .Com
21h | Fonctions universelles disques horloge ...
22h | Adresse de fin de processus
23h | Surveille la combinaison de touche Ctrl + Pause (ou Break)
24h | Erreur fatale d'un vecteur d'interruption
25h | Lecture direct du disque
26h | Ecriture direct du disque
27h | Programmes résidents
28h | Fin d'un programme résidant en mémoire
29h |
2Ah |
2Bh |
2Ch |
2Dh |
2Eh |
2Fh | Interruption pour plusieurs sous programmes


MSW

MSW Machin Status Word*

Pour le moment je ne sais pas si il s'agit d'un registre proprement dit ou bien d'un segment mémoire peut-etre, si quelqu'un veux m'éclairer, sinon j'irais acheter une lampe à carbure.

Bit | Nom | anglais | français | Notes
0 | PE | Protection enable | Mode protégé/ Mode réel | 1 si Mode protégé
1 | MP | Math Present | Présence du FPU | 1 si le coprocesseur mathématique est là.
2 | EM | Emulation | Emulation du FPU | 1 si le coprocesseur mathématique est émulé (remplacé par un logiciel)
3 | TS | Task Switched |  | je ne sais pas
4 | ET | Extension Type | Type étendue | Indique le type de coprocesseur étendue
5-30 |  | Reserved |  |
31 | PG | Paging | Mémoire Paginé | 1 si le processeur utilise une table pour traduire l'adresse physique en mémoire

L'acces se fait via les instructions LMSW et SMSW


Modes d'adressage

Les modes d'adressage:

Le processeur permet d'utiliser plusieurs modes d'adressage, regardons ses modes a travers des exemples utilisant l'instruction classique mov.

L'adressage immédiat , affecte une valeur constante aux registres.

mov eax,1
mov cx,5

L'adressage de registre , transfert des données entre registres.

mov ebx,eax
mov si,di

L'adressage direct , transfert l'adresse mémoire.

mov si,offset var (si = offset var)

L'adressage indirect de registre , accède à la valeur situé à l'adresse mémoire définis.

mov ax,[si] (ax = mem [si])


OpcodeHexa

Opcode en hexadécimal

00 ADD
01 ADD
02 ADD
03 ADD
04 ADD
05 ADD
06 PUSH
07 POP
08 OR
09 OR
0A OR
0B OR
0C OR
0D OR
0E PUSH
0F 00 LLDT
0F 00 LTR
0F 00 SLDT
0F 00 STR
0F 00 VERR
0F 00 VERW
0F 01 INVLPG
0F 01 LGDT
0F 01 LIDT
0F 01 LMSW
0F 01 SGDT
0F 01 SIDT
0F 01 SMSW
0F 01 SMSW
0F 02 LAR
0F 03 LSL
0F 08 INVD
0F 09 WBINVD
0F 0B UD2
0F 20 MOV
0F 21 MOV
0F 22 MOV
0F 23 MOV
0F 30 WRMSR
0F 31 RDTSC
0F 32 RDMSR
0F 33 RDPMC
0F 40 CMOVO
0F 41 CMOVNO
0F 42 CMOVB
0F 42 CMOVC
0F 42 CMOVNAE
0F 43 CMOVAE
0F 43 CMOVNB
0F 43 CMOVNC
0F 44 CMOVE
0F 44 CMOVZ
0F 45 CMOVNE
0F 45 CMOVNZ
0F 46 CMOVBE
0F 46 CMOVNA
0F 47 CMOVA
0F 47 CMOVNBE
0F 48 CMOVS
0F 49 CMOVNS
0F 4A CMOVP
0F 4A CMOVPE
0F 4B CMOVNP
0F 4B CMOVPO
0F 4C CMOVL
0F 4C CMOVNGE
0F 4D CMOVGE
0F 4D CMOVNL
0F 4E CMOVLE
0F 4E CMOVNG
0F 4F CMOVG
0F 4F CMOVNLE
0F 60 PUNPCKLBW
0F 61 PUNPCKLWD
0F 62 PUNPCKLDQ
0F 63 PACKSSWB
0F 64 PCMPGTB
0F 65 PCMPGTW
0F 66 PCMPGTD
0F 67 PACKUSWB
0F 68 PUNPCKHBW
0F 69 PUNPCKHWD
0F 6A PUNPCKHDQ
0F 6B PACKSSDW
0F 6E MOVD
0F 6F MOVQ
0F 71 PSLLW
0F 71 PSRAW
0F 71 PSRLW
0F 72 PSLLD
0F 72 PSRAD
0F 72 PSRLD
0F 73 PSLLQ
0F 73 PSRLQ
0F 74 PCMPEQB
0F 75 PCMPEQW
0F 76 PCMPEQD
0F 77 EMMS
0F 7E MOVD
0F 7F MOVQ
0F 80 JO
0F 81 JNO
0F 82 JB
0F 82 JC
0F 82 JNAE
0F 83 JAE
0F 83 JNB
0F 83 JNC
0F 84 JE
0F 84 JZ
0F 85 JNE
0F 85 JNZ
0F 86 JBE
0F 86 JNA
0F 87 JA
0F 87 JNBE
0F 88 JS
0F 89 JNS
0F 8A JP
0F 8A JPE
0F 8B JNP
0F 8B JPO
0F 8C JL
0F 8C JNGE
0F 8D JGE
0F 8D JNL
0F 8E JLE
0F 8E JNG
0F 8F JG
0F 8F JNLE
0F 90 SETO
0F 91 SETNO
0F 92 SETB
0F 92 SETC
0F 92 SETNAE
0F 93 SETAE
0F 93 SETNB
0F 93 SETNC
0F 94 SETE
0F 94 SETZ
0F 95 SETNE
0F 95 SETNZ
0F 96 SETBE
0F 96 SETNA
0F 97 SETA
0F 97 SETNBE
0F 98 SETS
0F 99 SETNS
0F 9A SETP
0F 9A SETPE
0F 9B SETNP
0F 9B SETPO
0F 9C SETL
0F 9C SETNGE
0F 9D SETGE
0F 9D SETNL
0F 9E SETLE
0F 9E SETNG
0F 9F SETG
0F 9F SETNLE
0F A0 PUSH
0F A1 POP
0F A3 BT
0F A4 SHLD
0F A5 SHLD
0F A8 PUSH
0F A9 POP
0F AA RSM
0F AB BTS
0F AC SHRD
0F AD SHRD
0F AF IMUL
0F B0 CMPXCHG
0F B1 CMPXCHG
0F B2 LSS
0F B3 BTR
0F B4 LFS
0F B5 LGS
0F B6 MOVZX
0F B7 MOVZX
0F BA BT
0F BA BTC
0F BA BTR
0F BA BTS
0F BB BTC
0F BC BSF
0F BD BSR
0F BE MOVSX
0F BF MOVSX
0F C0 XADD
0F C1 XADD
0F C7 CMPXCHG8B
0F C8 BSWAP
0F D1 PSRLW
0F D2 PSRLD
0F D3 PSRLQ
0F D8 PSUBUSB
0F D9 PSUBUSW
0F DB PAND
0F DC PADDUSB
0F DD PADDUSW
0F DF PANDN
0F E1 PSRAW
0F E2 PSRAD
0F E5 PMULHW
0F E8 PSUBSB
0F E9 PSUBSW
0F EB POR
0F EC PADDSB
0F ED PADDSW
0F EF PXOR
0F F1 PSLLW
0F F2 PSLLD
0F F3 PSLLQ
0F F5 PMADDWD
0F F8 PSUBB
0F F9 PSUBW
0F FA PSUBD
0F FC PADDB
0F FD PADDW
0F FE PADDD
10 ADC
11 ADC
12 ADC
13 ADC
14 ADC
15 ADC
16 PUSH
17 POP
18 SBB
19 SBB
1A SBB
1B SBB
1C SBB
1D SBB
1E PUSH
1F POP
20 AND
21 AND
22 AND
23 AND
24 AND
25 AND
27 DAA
28 SUB
29 SUB
2A SUB
2B SUB
2C SUB
2D SUB
2F DAS
30 XOR
31 XOR
32 XOR
33 XOR
34 XOR
35 XOR
37 AAA
38 CMP
39 CMP
3A CMP
3B CMP
3C CMP
3D CMP
3F AAS
40 INC
48 DEC
50 PUSH
58 POP
60 PUSHA
60 PUSHAD
61 POPA
61 POPAD
62 BOUND
63 ARPL
68 PUSH
69 IMUL
6A PUSH
6B IMUL
6C INS
6C INSB
6D INS
6D INSD
6D INSW
6E OUTS
6E OUTSB
6F OUTS
6F OUTSD
6F OUTSW
70 JO
71 JNO
72 JB
72 JC
72 JNAE
73 JAE
73 JNB
73 JNC
74 JE
74 JZ
75 JNE
75 JNZ
76 JBE
76 JNA
77 JA
77 JNBE
78 JS
79 JNS
7A JP
7A JPE
7B JNP
7B JPO
7C JL
7C JNGE
7D JGE
7D JNL
7E JLE
7E JNG
7F JG
7F JNLE
80 ADC
80 ADD
80 AND
80 CMP
80 OR
80 SBB
80 SUB
80 XOR
81 ADC
81 ADD
81 AND
81 CMP
81 OR
81 SBB
81 SUB
81 XOR
83 ADC
83 ADD
83 AND
83 CMP
83 OR
83 SBB
83 SUB
83 XOR
84 TEST
85 TEST
86 XCHG
87 XCHG
88 MOV
89 MOV
8A MOV
8B MOV
8B MOV
8C MOV
8D LEA
8E MOV
8F POP
90 NOP
90 XCHG
98 CBW
98 CWDE
99 CDQ
99 CWD
9A CALL
9A CALL
9B D9 FSTCW
9B D9 FSTENV
9B DB E2 FCLEX
9B DB E3 FINIT
9B DD FSAVE
9B DD FSTSW
9B DF E0 FSTSW
9B FWAIT
9B WAIT
9C PUSHF
9C PUSHFD
9D POPF
9D POPFD
9E SAHF
9F LAHF
A0 MOV
A1 MOV
A2 MOV
A3 MOV
A4 MOVS
A4 MOVSB
A5 MOVS
A5 MOVSD
A5 MOVSW
A6 CMPS
A6 CMPSB
A7 CMPS
A7 CMPSD
A7 CMPSW
A8 TEST
A9 TEST
AA STOS
AA STOSB
AB STOS
AB STOSD
AB STOSW
AC LODS
AC LODSB
AD LODS
AD LODSD
AD LODSW
AE SCAS
AE SCASB
AF SCAS
AF SCASD
AF SCASW
B0 MOV
B8 MOV
C0 RCL
C0 RCR
C0 ROL
C0 ROR
C0 SAL
C0 SAR
C0 SHL
C0 SHR
C1 RCL
C1 RCR
C1 ROL
C1 ROR
C1 SAL
C1 SAR
C1 SHL
C1 SHR
C2 RET
C3 RET
C4 LES
C5 LDS
C6 MOV
C7 MOV
C8 00 ENTER
C8 01 ENTER
C8 ENTER
C9 LEAVE
CA RET
CC INT
CD INT
CE INTO
CF IRET
CF IRETD
D0 RCL
D0 RCR
D0 ROL
D0 ROR
D0 SAL
D0 SAR
D0 SHL
D0 SHR
D1 RCL
D1 RCR
D1 ROL
D1 ROR
D1 SAL
D1 SAR
D1 SHL
D1 SHR
D2 RCL
D2 RCR
D2 ROL
D2 ROR
D2 SAL
D2 SAR
D2 SHL
D2 SHR
D3 RCL
D3 RCR
D3 ROL
D3 ROR
D3 SAL
D3 SAR
D3 SHL
D3 SHR
D4 (No mnemonic)
D4 0A AAM
D5 (No mnemonic)
D5 0A AAD
D7 XLAT
D7 XLATB
D8 C0 FADD
D8 C8 FMUL
D8 D0 FCOM
D8 D1 FCOM
D8 D8 FCOMP
D8 D9 FCOMP
D8 E0 FSUB
D8 E8 FSUBR
D8 F0 FDIV
D8 F8 FDIVR
D8 FADD
D8 FCOM
D8 FCOMP
D8 FDIV
D8 FDIVR
D8 FMUL
D8 FSUB
D8 FSUBR
D9 C0 FLD
D9 C8 FXCH
D9 C9 FXCH
D9 D0 FNOP
D9 E0 FCHS
D9 E1 FABS
D9 E4 FTST
D9 E8 FLD1
D9 E9 FLDL2T
D9 EA FLDL2E
D9 EB FLDPI
D9 EC FLDLG2
D9 ED FLDLN2
D9 EE FLDZ
D9 F0 F2XM1
D9 F2 FPTAN
D9 F3 FPATAN
D9 F4 FXTRACT
D9 F5 FPREM1
D9 F6 FDECSTP
D9 F7 FINCSTP
D9 F9 FYL2XP1
D9 FA FSQRT
D9 FB FSINCOS
D9 FC FRNDINT
D9 FD FSCALE
D9 FE FSIN
D9 FF FCOS
D9 FLD
D9 FLDCW
D9 FLDENV
D9 FNSTCW
D9 FNSTENV
D9 FST
D9 FSTP
DA C0 FCMOVB
DA C8 FCMOVE
DA D0 FCMOVBE
DA D8 FCMOVU
DA E9 FUCOMPP
DA FIADD
DA FICOM
DA FICOMP
DA FIDIV
DA FIDIVR
DA FIMUL
DA FISUB
DA FISUBR
DB C0 FCMOVNB
DB C8 FCMOVNE
DB D0 FCMOVNBE
DB D8 FCMOVNU
DB E2 FNCLEX
DB E3 FNINIT
DB E8 FUCOMI
DB F0 FCOMI
DB FILD
DB FIST
DB FISTP
DB FLD
DB FSTP
DC C0 FADD
DC C8 FMUL
DC E0 FSUBR
DC E8 FSUB
DC F0 FDIVR
DC F8 FDIV
DC FADD
DC FCOM
DC FCOMP
DC FDIV
DC FDIVR
DC FMUL
DC FSUB
DC FSUBR
DD C0 FFREE
DD D0 FST
DD D8 FSTP
DD E0 FUCOM
DD E1 FUCOM
DD E8 FUCOMP
DD E9 FUCOMP
DD FLD
DD FNSAVE
DD FNSTSW
DD FRSTOR
DD FST
DD FSTP
DE C0 FADDP
DE C1 FADDP
DE C8 FMULP
DE C9 FMULP
DE D9 FCOMPP
DE E0 FSUBRP
DE E1 FSUBRP
DE E8 FSUBP
DE E9 FSUBP
DE F0 FDIVRP
DE F1 FDIVRP
DE F8 FDIVP
DE F9 FDIVP
DE FIADD
DE FICOM
DE FICOMP
DE FIDIV
DE FIDIVR
DE FIMUL
DE FISUB
DE FISUBR
DF E0 FNSTSW
DF E8 FUCOMIP
DF F0 FCOMIP
DF FBLD
DF FBSTP
DF FILD
DF FIST
DF FISTP
E0 LOOPNE
E0 LOOPNZ
E1 LOOPE
E1 LOOPZ
E2 LOOP
E3 JCXZ
E3 JECXZ
E4 IN
E5 IN
E6 OUT
E7 OUT
E8 CALL
E9 JMP
EA JMP
EB JMP
EC IN
ED IN
EE OUT
EF OUT
F0 LOCK
F2 A6 REPNE
F2 A7 REPNE
F2 AE REPNE
F2 AF REPNE
F3 6C REP
F3 6D REP
F3 6E REP
F3 6F REP
F3 A4 REP
F3 A5 REP
F3 A6 REPE
F3 A7 REPE
F3 AA REP
F3 AB REP
F3 AC REP
F3 AD REP
F3 AE REPE
F3 AF REPE
F4 HLT
F5 CMC
F6 DIV
F6 IDIV
F6 IMUL
F6 MUL
F6 NEG
F6 NOT
F6 TEST
F7 DIV
F7 IDIV
F7 IMUL
F7 MUL
F7 NEG
F7 NOT
F7 TEST
F8 CLC
F9 STC
FA CLI
FC CLD
FD STD
FE DEC
FE INC
FF CALL
FF DEC
FF INC
FF JMP
FF PUSH


pile
Si vous trouvé des erreurs merci de me le signaler. Le texte qui suit est une suite de métaphores dont le but est d'aider la compréhension du fonctionnement du processeur, tâche pas franchement facile. On ne dira aucun mal de Mac Gyver rassurez-vous.

La notion de pile est quelque chose qui n'est pas évident au premier abord et c'est un des éléments important pour bien comprendre ce que l'on fait, en particulier avec le coprocesseur mathématique.

Imaginons que vous ayez sur votre table ou bureau délimiter un espace pour empiler des fiches cartonnées, commençons par mettre une première fiche, puis posons une autre fiche au dessus, jusque là tout va bien, nous avons donc empilé 2 fiches, on est joueur on va mettre une troisième fiche dessus, ouah on a 3 fiches empilés.
Considérons que nous ne pouvons pas faire autrement que poser au dessus et retirer par le dessus, pour accèder à la fiche tout en bas il nous faut donc retirer la fiche en haut de la pile puis celle juste en dessous et enfin on a accès à la fiche.
Continuons d'imaginer que nous jouons avec nos petites fiches et nous allons donner un petit nom anglais pour le fun à l'action de poser une fiche ce nom sera PUSH et pour retirer on va dire que l'on POP.
Dorénavant si je dis je push 1 fiche tout le monde comprends que je pose une fiche sur la pile, si je la pop je la retire.

Maintenant il est important de savoir qu'une pile c'est un bout de mémoire réservé à cela, un espace mémoire, pour le FPU (coprocesseur mathématique) ce bout de mémoire est interne par exemple.
La pile que l'on à décrite est une pile LIFO pour last in first out dernier arrivé, premier partis, c'est comme une pile d'assiètes on prend en premier la derniere posée... Mais il est possible de créer des piles FIFO first in first out, soit premier arrivé, premier à sortir.

Ouais d'accord mais .....à quoi ça sert???

L'appel aux api windows ou procédures basées sur des appels par la pile.
Avec Masm on peut écrire:
invoke ExitProcess,eax
invoke ne fait pas partis des instructions assembleur, c'est une instruction dite de haut niveau pour simplifier la programmation assembleur en fait nous aurions dut écrire les lignes suivantes:
push 0
call ExitProcess

NDLA: Pour la procédure ExitProcess ça reste facile mais certaines instructions demande pas mal de paramètres et là c'est galère, mais je ne suis pas là pour faire la promo de invoke.

On voit donc que pour appeler ExitProcess on met sur la pile 0, la procédure ExitProcess va probablement faire un pop pour récupérer ce 0 et agir en conséquence.
Donc pour se servir des API l'asm utilise la pile. En faite c'est normal puisque la fonction qui nous a servie d'exemple est dans la dll Kernel32 et comment faire pour passer des valeurs aux fonctions quel contient ? ben la pile, c'est pas mal en faite.

Sauver et restaurer des registres.

Nombre d'api renvois dans eax une valeur de retour, vous pouvez faire
push eax
utiliser une autre api par exemple puis
faire un pop eax pour récupèrer la valeur
attention a bien faire le pop, vous pourriez saturer la pile ou la rendre bancale et se serait le crash assuré!

La FPU

La fpu utilise une pile pour stocker les valeurs numériques, même si on appel cette pile registre ST, il n'empêche qu'en réalité c'est une pile.

Notions complémentaires:

Le pointeur de pile, stack pointer pour les intimes, c'est ni plus ni moins qu'un pointeur mémoire qui indique ou l'on se situe dans la pile.

Voila c'est tout pour le moment...


InfoGenerales

Annexe

Au début vous allez être surpris de voir certaines instructions dans les sources d'exemple et vous allez vous dire mais pourquoi ils font ça ? Par exemple xor eax,eax, en faite ces instructions sont utilisées à la place d'autres pour rendre le code encore plus rapide... Voyons voir ce que l'on trouve fréquemment:

Code plus rapide | Remplace le code
xor eax,eax | mov eax,0
or eax,eax | test eax

Au passage si vous avez d'autres astuces du genre, n'hésitez pas une seule seconde...

Processeur | Modes disponibles | Mémoire adressable | Taille du segments
8086/8088 | Réel | 1MegaOctet | 16 Bits
80186/80188 | Réel | 1 Mo | 16 Bits
80286 | Réel et protéger | 16 Mo | 16 Bits
80386 | Réel et protéger | 4Go | 16 ou 32 Bits
80486 | Réel et protéger | 4Go | 16 ou 32 Bits
80586 | ? |  |


ProgrammerAsm

Programmer en asm sous Windows*

Cette section est consacrée à la programmation asm sous Windows via RADASM et MASM32 l'assembleur de Microsoft. Pourquoi ce choix ?

RADASM est un IDE, comprenez environnement de développement intégré (il permet de "dessiner des boites de dialogue de façon visuel comme dans Visual Basic). Ces 2 outils sont totalement gratuit et facilement trouvable sur internet. Les exemples fournis seront dédiés a ces 2 programmes...

Pourquoi programmer en assembleur ? A mon avis chacun peut y trouver un intérêt et d'autres n'y voir aucun intérêt, peut importe les grands débats vitesse etc... Perso j'aime ce langage et c'est déjà une bonne raison pour moi.

Organisation générale du code asm, attention le code ci-dessous ne fait rien c'est juste des petits bouts d'exemples pour faciliter la compréhension de l'organisation proprement dite:

Instructions de compilation ex:
.386
.model flat, stdcall
option casemap :none ; case sensitive

Les inclusions de codes ex:
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
include MesFichiers_a_Moi.inc ;Vos fichiers .inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib

Les macros ex:
return MACRO arg
mov eax, arg
ret
ENDM

Le Prototypage des procédures ex:
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD

Les constantes ex:
.const
;Avec les équivalence (txt equ val) qui vont vous permettre d'utiliser des mots à la place de valeur
IDD_DIALOG equ 1000

Les Données initialisées ex:
.data
;Les chaines de caractères, par exemple le titre de l'application etc...
szAppName db 'Exemple d'application',0

Les Données (buffer etc..) ex:
.data?
hInstance dd ?
CommandLine dd ?
hWnd dd ?
TitreStr db 128 DUP(?)
TexteStr db 128 DUP(?)

La zone de code proprement dite, ex:
.code

start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke InitCommonControls
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax

Les Procédures, ex:
WndProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
LOCAL msg:dword ; (variable locale)
xor eax,eax
ret
WndProc endp ; (fin de procédure)

La fin du code:
end start


Masm32*

Masm32 est l'assembleur de microsoft, il est gratuit et très largement diffusé, vous trouverez donc assez facilement des exemples compilable sous Masm. Vous pouvez éditer les sources asm avec le notepad ou avec l'éditeur QEDITOR fournit avec MASM. Il existe d'autre éditeur dédié comme EditMasm de "ToutEnMasm" ( http://perso.wanadoo.fr/luce.yves/ ) par exemple.

Coté IDE il y'a Radasm de Ketilo qui s'avère très pratique et éfficace, vous le trouverez à l'adresse: www.radasm. com


FileIO

Ecriture/Lecture des fichiers*

Cette section est là pour vous aidez à utiliser les fichiers. Beaucoup de programmes utilisent des fichiers, je ne vous l'apprends pas. Parmis les fichiers on trouvent en générale:

  • Les fichiers standards (jpeg / bmp / wav / txt / rtf /etc.)
  • Les fichiers ini et leurs dérivées pour conserver les paramètres du programme par exemple.
  • Les fichiers propriétaires, lu et écrit par leurs programmes respectifs, les dlg / mnu pour RADASM par exemple

Lorsque l'on réalise un programme, il est fréquent d'utiliser ces trois grandes familles. Il nous est utile de garder les préférences de l'utilisateur dans un fichier .ini , de travailler dans un format propriétaire et de proposer l'export et l'import dans un format grand publique si c'est possible.

Tout ça c'est bien mais en assembleur comment on fait ?

En règle général lorsqu'il s'agit de fichier on se sert de la boite dialogue d'ouverture de fichier standard, je vous renvois à la section sur les boites dialogues standards pour en apprendre plus.

Séquence générale d'ouverture d'un fichier:

Appel de la fonction CreateFile pour ouvrir le fichier, GetFileSize pour obtenir sa taille, GlobalAlloc pour réserver une place en mémoire de la taille du fichier a charger, GlobalLock pour obtenir le pointeur de l'adresse mémoire que l'on vient de réserver, ReadFile pour charger le fichier en mémoire, CloseHandle pour libérer le handle du fichier, puis à la fermeture du programme GlobalFree pour libérer la mémoire réservée.


Regsvr32

Regsvr32 (Enregistrement de Dll)

Description:

Utile pour enregistrer une dll ou un composant activeX dans la base de registre.

Syntaxe:

Regsvr32 [/u] [/s] [/n] [/c][/i[:cmdline]] dllname.

Paramètres:

/u Unregister, pour désenregistrer la dll
/s Silent, pour enregistrer sans faire apparaitre la boite de message d'enregistrement.
/c Console, Affiche la console.
/n Not , n'appel pas dllregisterserver
/i cmdline, passe une ligne de commande (optionnel)
/? Help, affiche l'aide


Look Xp

Comment fait-on pour avoir des controles au look xp ?

Le plus imple c'est d'utiliser un fichier manifest. Il existerait un add-in pour inclure le" manifest" dans la ressource de votre programme, sinon il vous suffit de créer un fichier txt et de copier coller le texte sous la ligne de séparation, puis de renommer le fichier txt en VotreProjet.exe.manifest.
Pour que ça ne plante pas, il faut inclure la librairie comctl32 et initialiser... Pour vous simplifier voici le code:
(Les lignes sous la barre qui ne sont pas en italique concerne manifest.)
Sinon il y'a la solution de créer ses propres contrôles, mais là sa demande beaucoup d'effort et l'intérêt n'en vaut peut-être pas la chandelle.

.586
.model flat,stdcall
option casemap:none
include comctl32.inc ;manifest
includelib comctl32.lib
.code
Start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke InitCommonControls ;initialisation pour manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity
name="Process Explorer"
processorArchitecture="x86"
version="1.0.0.0"
type="win32"/>
<description>Process Explorer</description> <dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="x86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>


Radasm

RADASM http://radasm.visualassembler.com/

RADASM est un excellent IDE écrit par Ketil Olsen, j'en ai essayé plusieurs et c'est le seul qui m'ai convaincu, de plus il bénéficie maintenant d'une francisation et d'une installation facile. Il est possible d'ajouter des composants, de le paramétrer très largement, bref je le trouve énorme.

Utilisation des break points pour le debuggage

Pour pouvoir utiliser cette fonctionnalité dans RADASM il faut ajouter la ligne de code suivante:
include \RadASM\masm\inc\radbg.inc

Les break points arrête le fonctionnement de votre programme et vous affiche les valeurs contenus dans les registres ainsi que la ligne de code ou le programme est arrêté dans votre source ouvert. Pour voir cette fonctionnalité je vous conseil d'ouvrir le projet TestProjet fournis dans les exemples. (..\radasm\masm\projects\testprojet\testprojet.rad)

Prise en main de RADASM

Si toutefois vous ne l'aviez pas vu, l'introduction est un exemple pour vous familiariser avec RADASM, puis un autre exemple vous montre comment ajouter un menu a notre exemple.

Inclure l'aide dans le menu Aide de RADASM

    Tout d'abord copier le fichier AsmBook.chm dans le répertoire
help qui se situe dans le répertoire de RADASM, si vous avez mis RADASM en C: cela donne c:\Radasm\help\asmbook.chm
Puis ouvrez le fichier ini de RADASM soit c:\Radasm\Radasm.ini
avec le bloc note par exemple, et retrouvez dans ce fichier les lignes
suivantes:
[MenuMacro]

[MenuHelp]
1=&Win32 Api,0,H,$H\Win32.hlp
2=&X86 Op Codes,0,H,$H\x86eas.hlp
3=&Masm32,0,H,$H\Masm32.hlp
4=&Resource,0,H,$H\Rc.hlp
5=A&gner,0,H,$H\Agner.hlp
6=&RadASM,0,H,$R\Help\RadASM.chm

Il ne vous reste plus qu'a ajouter la ligne ci dessous:
7=&AsmBook,0,H,$R\Help\ASMBOOK.chm

Dès que possible je traduirais un maximum la documentation de RADASM.


Introduction

Comment c'est qu'on fait ?

Le mieux c'est de passer par un exemple, voir plusieurs.

Vous devez avoir installer Masm32 et Radasm pour pouvoir suivre ces exemples.Après avoir ouvert Radasm, nous allons créer un nouveau projet.La création d'un nouveau projet ouvre un assistant, simplifiant ainsi la création des nouveaux projets.

Le projet est de type win32 App, (application executable pour windows)
Son Nom est Exemple1, et vous pouvez rentrer ce que vous souhaité en description. Un clic sur suivant pour continuer la création de notre nouveau projet.

Radasm vous propose d'utiliser des modèles préconçus (template) pour accélèrer la conception de nos programmes, il nous est possible de créer aussi nos propre modèles.Pour nous simplifier la tâche, nous allons utiliser un de ces modèle appelé DialogApp.tpl.

Nous allons laisser le choix par defaut pour le moment, vous pouvez par exemple cocher txt pour créer un fichier txt lié a votre projet pour par exemple prendre vos notes ou faire un historique etc..

Cette page de l'assistant nous propose de modifier les options de compilation, il ne nous est pas nécessaire de modifier quoi que ce soit. Pour en savoir plus sur ces options je vous renvois dans la documentation de Radasm.

Une fois créer, nous avons dans "l'exploreur" de radasm l'ensemble des fichiers créer,

  • Exemple1.asm (Le fichier assembleur de notre programme)
  • Exemple1.asm (Un fichier .inc inclus a notre programme)
  • Exemple1.dlg (La boite de dialogue de notre programme)
  • Exemple1.Rc (La définition des ressources inclus a notre programme)

Un double clic sur Exemple1.dlg et nous voila devant notre boite de dialogue, sur notre gauche une toolbar (boite à outil) contenant des objets pouvant être rajoutés a notre boite et sur la droite la liste des propriétées associées à l'objet selectionné. Ici notre boite est selectionnée. Dans les propriétée on a son Id identifiant qui doit être unique, son Nom, le caption qui n'est autre que le texte affiché dans la barre de notre boite etc... Les habitués de Visual Basic n'aurons pas de mal à se familiarisé avec cette IDE mais ils trouverons des différences notables.

A présent ouvrons le fichier Exemple1.asm

La fenêtre de l'ide contient le code de notre programme. Que trouvons nous là ?
Note: Pour insérer des commentaires il suffit de taper ; dans la configuration d'origine, ils apparaissent en jaune.

.386 indique au compilateur quel jeu d'instructions et d'adressage nous allons pouvoir utiliser.
Puis viennent différentes options de compilation.
.model flat
option casemap :none

Nous devons inclure à notre programme notre fichier .inc pour que le compilateur puisse s'en servir, nous verrons plus loin ce qu'il contient
include Exemple1.inc
Puis nous indiquons au compilateur que ce qui suit est la section contenant le code assembleur de notre programme
.code
Ci dessous le label de départ de notre programme.
start:
On demande un handle, ce handle est notre identifiant "processus" unique associé a notre programme.Le handle est retourné par la fonction dans le registre eax, pour pouvoir l'utiliser plus tard nous le mettons au chaud dans un bout de mémoire que nous avons reservé et qui s'appel hInstance , nous verrons comment nous l'avons reservé lorsque nous regarderons ce qui se trouve dans le fichier Exemple1.inc
invoke GetModuleHandle,NULL
mov hInstance,eax
La fonction InitCommonControls s'assure que la common control (DLL) est chargée.
invoke InitCommonControls
On appel la fonction DialogBoxParam qui va se charger de créer notre boite de dialogue et on lui passe en paramètre notre procédure DlgProc pour recevoir les messages de cette boite de dialogue le temps de son existence. On passe a notre fonction les paramètres suivant hInstance (le handle process de notre programme), IDD_DIALOG1 (constante qui vaut 101 vous savez le numéro Id de notre boite de dialogue), le paramètre qui suit est NULL car notre fenêtre n'est pas fille d'une autre fenêtre (sinon on aurait indiqué le handle de la fenêtre mère), puis viens l'addresse de notre procédure DlgProc, et enfin NULL(le retour) Sert a passer des valeurs d'initialisation par defaut.
invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
La fonction qui suit sera appelée une fois notre fenêtre détruite et se chargera de détruire le processus (hInstance) de notre programme
invoke ExitProcess,0

La procedure de dialogue
Cette procédure reçoit les messages associés à notre boite de dialogue, pour comprendre ces messages il nous faut un certains nombre d'informations c'est pourquoi la procédure reserve des bouts de mémoire que nous allons décrire, hWin recevra le Handle de notre boite de dialogue (car chaque fenêtre windows a son propre identifiant), puis uMsg pour le type de message et ensuite viennent les structures de message qui sont on va dire les valeurs associés au message par exemple si on reçoit un message de type WM_MOVE qui signifie que notre fenêtre a été déplacée on trouvera sa nouvelle position dans lparam.
DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
On déplace le message reçu dans eax pour pouvoir le comparer avec les type de messages qui nous interressent
mov eax,uMsg
S'il s'agit d'un message de type WM_INITDIALOG, message reçu a l'initialisation de notre boite avant son affichage
.if eax==WM_INITDIALOG
Ici nous pourrions mettre du code qui ne serait donc appelé qu'a l'initialisation de notre boite
.elseif eax==WM_COMMAND
ici nous pourrions mettre du code pour réagir aux messages de type WM_COMMAND (clic)
.elseif eax==WM_CLOSE
Message reçu lors du clic sur la croix de fermeture de la fenêtre.
ci dessous le code pour fermer notre fenêtre
invoke EndDialog,hWin,0
Si toutefois nous recevons aucun de ces messages la nous allons mettre la valeur false dans eax, je crois pour indiquer que nous n'avons pas traité le message puis ret pour rendre la main.
.else
mov eax,FALSE
ret
.endif
Si le message est traité nous l'indiquons en mettant a True eax avant de rendre la main.
mov eax,TRUE
ret
On indique ici au compilateur que c'est la fin de notre procédure
DlgProc endp
et ici que c'est la fin de notre start déclaré au début du code
end start

Allons Voir dans le fichier Exemple1.inc

Pourquoi créer un fichier .inc ? En fait rien ne nous y oblige mais cela rend le code plus clair et permet un regroupement de nos variables, etc...
Au tout début du fichier les librairies inclusent dans notre projet, puis viens le prototypage de DlgProc, en quelque sorte le format de notre procédure.
.const
Indique au compilateur qu'il s'agit de la section ou l'on déclare les constantes, les constantes sont des valeurs prédéfinis, on pourrait par exemple y déclarer que Pi vaut 3.14, c'est une constante. Ici l'assistant a déclarer pour nous IDD_DIALOG1 equ 101 ce qui veut dire que lorsque l'on va taper dans notre code IDD_DIALOG1, le compilateur comprendra qu'il s'agit de la valeur 101 encore une fois rien ne nous oblige a utiliser des constantes mais cela permet encore une fois de rendre le code plus lisible et plus facile a reprendre lorsque l'on voudra faire évoluer le programme.

.data?
Les variables non initialisées, en fait cela reserve un bout de mémoire que l'on nomme pour pouvoir l'utiliser.

.data
Ici il n'y a pas de section de variable initialisé, variable dont la valeur est fixé au préalable, mais nous y reviendrons plus tard.

Grace a l'assistant nous n'avons taper aucun code, mais est-ce que ça marche ? Il faut pour cela compiler notre projet et le tester.

La console nous indique l'état d'avancement de la compilation et les erreurs éventuelles.

Une fois notre executable créé, nous pouvons l'ouvrir depuis radasm via la commande Run
Ce qui va ouvrir notre boite de dialogue refermable via la croix de fermeture.

Ajout d'un menu à notre exemple


ExMenu

Ajout d'un menu à notre exemple:

Reprenons l'exemple décris précédemment, nous allons procéder à l'ajout d'un menu a celui-ci.
Un clic droit et on créer une ressource de type menu.

Vous allez être invité a nommer ce menu et à l'enregistrer, nous allons le nommer MnuMain.

Vous devez donc vous retrouvez devant l'éditeur de menu, celui-ci est assez simple.
[Texte] Pour entrer le texte qui apparaitra dans le menu
[Commande Clavier] Une liste vous propose une série de raccourcis clavier
[Nom] L'identifiant de votre menu
[n°] Le numéro de la ressource
Les différentes cases à cocher sont aisé a comprendre...Faite des essais si vraiment vous ne savez pas.
Les Flèches sont importantes et vous aiderons à organiser la hiérarchie du menu. Chaque entrées de menu verront leurs placement affecté par ce moyen. Au plus à gauche les entrées de menu et leurs sous menu en décallage à droite...

Voila un exemple de menu ( les entrées Paramètrer et Imprimer sont des sous menus de l'entrée Impression).
Pour utiliser ce menu, ouvrez à nouveau votre boite de dialogue et dans la propriétée menu ouvrez votre menu nouvellement créer.

A ce stade, si vous compilé à nouveau votre programme, le menu sera inclus à votre boite de dialogue.

Pour pouvoir réagir à l'utilisation de ce menu, il va falloir récupérer les numéros de ressource et pour faire simple créer des "equ" dans le fichier .inc
MenuTruc equ 10000 ; par exemple
Radasm possède un outil qui va nous faciliter la tâche. CTRL+F11 ou menu outil puis exportateur de n° de ressource. Ce qui va ouvrir la fenetre suivante:

Selectionnez votre menu, ici MnuMain et valider.

Dans la console de RADASM, vos equivalences. Il va vous suffir de faire un simple copier coller. Copier ces equivalences et collé les dans le fichier .inc(include exemple1.inc), comme ci dessous:

Dorénavant IDM_About sera strictement identique a 10002 pour identifier l'entrée [A Propos] du menu.
Réagissons au clic sur l'entrée [A Propos] du menu. Nous allons afficher une boite de message.
On ajoute une section .data dans le fichier .inc
Et dans cette section on ajoute 2 chaines de caractères, une pour le titre de la message box et l'autre pour le message:

Dans le code assembleur pour réagir on va rentrer le code suivant:

Si la command reçut est Bn_Clicked , on regarde s'il s'agit de notre entrée, si oui, alors on fait apparaitre une messagebox.


RadasmTemp

Création d'un template (modèle)

Radasm inclu une série de modèles pour vous faciliter la programmation, lors de la création d'un nouveau projet, l'assistant vous propose de vous servir de l'un de ceux-ci ce qui va vous faire gagner du temps.
Pour être encore plus éfficace, créer vos modèles. Nous allons voir ici comment procéder.


Win32API

Qu'est ce que les Api de Windows ? Application Programmable Interface

Il s'agit des fameuses dll fournit avec windows. Ces dll vous permettent de créer des programmes utilisant windows, il s'agit en faite de librairies de fonctions programmables. Ces dll vous seront utile pour créer des fenêtre windows , recevoir les messages , etc..

Il existe un tres grand nombre de fonctions pour interfacer Windows. Chaque librairie (dll) contient plusieurs fonctions regroupées par thème.

Parmis les librairies les plus courantes, nous trouvons Gdi32.dll par exemple qui regroupe les fonctions graphique de windows.

Comment utiliser ces librairies ?

A l'installation Masm32 précompile un ensemble de librairie ce qui nous simplifiera la tâche pour les utiliser dans nos programmes, pour appeller une fonction de la librairie Gdi32.dll il suffira de taper les instructions suivantes en début de notre code ce qui permet d'inclure les fichiers préconçus fournis avec Masm32.

include gdi32.inc

includelib gdi32.lib

Puis faire un appel à la fonction souhaitée, exemple:

invoke TextOut,hdc,x,y,addr Texte,eax

Cette fonction écrit une chaîne de caractère sur le périphérique spécifié à une position donnée.
Les caractéristiques courantes du texte sont utilisées.
hdc est un pointeur vers le périphérique d'affichage.
x et y sont les coordonnées de départ d'écriture de la chaîne.
addr Texte pointe sur la chaîne de caractère à écrire.
eax contient la longueur de la chaîne.(Qu'il faudra renseigner au préalable)
Si la fonction échoue, elle retourne 0 dans eax.

Comment trouver la bonne fonction ?

Ben la c'est pas forcement très simple, il faut chercher, au début on si perd et puis à force on trouve assez facilement en faite. L'indispensable Win32.hlp contient beaucoup d'informations mais il est en anglais et écrit pour le C.
La première chose c'est de comprendre que les fonctions sont regroupées par librairie les fonctions graphique dans la gdi32.dll par exemple. Donc si l'on cherche comment dessiner un cercle on va probablement trouver notre bonheur dans cette librairie.
Pour vous faciliter la recherche, vous trouverez l'ensembles des fonctions classées par ordre alphabétique dans cette section et dans l'onglet index de l'aide un regroupement des fonctions par librairie, sous l'index Gdi32 par exemple une liste de fonction appartenant a cette librairie avec le liens vers sa descriptions lorsqu'elle est disponible. Voir aussi user32, Kernel32

Concept généraux de windows ?

Lors de la création d'une application, windows vous attribue un identifiant unique appelé handle, et fait de même à la création de chaque objet et chaque contexte de périphérique, ces handles (identifiants) sont important car c'est grâce à eux que l'on pourra définir sur qui ou quoi on agit.

Classement par thèmes


AbortDoc

AbortDoc,Hdc

Librairie: Gdi32.dll

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:

La fonction AbortDoc stop l'impression en cours et efface tout depuis le dernier appel de la fonction StartDoc.

Paramètres:

Hdc
 handle du contexte de périférique, ce handle est créer par la fonction CreateDC

Valeur retournée:
Si la fonction réussie elle retourne une valeur supérieur à 0.
Si la fonction échoue,la valeur de retour est SP_ERROR.Pour obtenir plus de détails concernant l'erreur faite appel à la fonction GetLastError.

Remarques:

Applications should call the AbortDoc function to stop a print job if an error occurs, or to stop a print job after the user cancels that job. To end a successful print job, an application should call the EndDoc function.
If Windows Print Manager was used to start the print job, calling the AbortDoc function erases the entire spool job, so that the printer receives nothing. If Print Manager was not used to start the print job, the data may already have been sent to the printer. In this case, the printer driver resets the printer (when possible) and ends the print job.

Exemple:
Pas d'exemple disponible pour le moment.

Voir aussi

EndDoc, SetAbortProc, StartDoc


AdjustWindowRect

BOOL AdjustWindowRect(

LPRECT lpRect, // address of client-rectangle structure
DWORD dwStyle, // window styles
BOOL bMenu // menu-present flag
);

Librairie: User32.dll

Versions : .
Windows 95/98 : Oui .
Windows NT : Oui .
Windows 2000/XP : Oui

Description:

La fonction AdjustWindowRect calcule la taille (extérieure) voulue du rectangle d'une fenêtre, à partir de la taille du rectangle de son client-area désirée (client-area c'est la zone intérieure dans laquelle on peut écrire du texte). On peut alors passer le rectangle de fenêtre à la fonction CreateWindow pour créer une fenêtre avec un secteur client (Client-area) à la taille qu'on voulait avoir.
Paramètres:

LpRect
Pointe sur une structure RECT laquelle contient les coordonnées du rectangle du secteur client.

dwStyle
Spécifie le style de la fenêtre en lequel le rectangle client doit être converti.

bMenu
Spécifie si la fenêtre possède un menu. Valeur retournée:

La valeur en retour est TRUE si la fonction est couronnée de succès, ou FALSE si une erreur s'est produite. Utilisez la fonction GetLastError pour obtenir l'information à propos de l'erreur étendue.

Remarque:

Dans une fenêtre, le rectangle client est le plus petit rectangle qui inclure complètement le secteur client. Un rectangle de fenêtre est le plus petit rectangle qui inclut la fenêtre en entier.
AdjustWindowRect ne prend ni le titres ni les bords en considération en calculant la taille du secteur client. Pour les styles de fenêtre qui incluent des titres et des bords, les applications (programmes) doivent ajouter la taille du titre et des bords après le Call AdjustWindowRect. Cette fonction ne prend pas non plus de rangées supplémentaires en considération lorsque une barre de menu enveloppe deux ou plusieurs rangées.

Voir aussi:

AdjustWindowRectEx, CreateWindowEx


BitBlt

 Fonction BitBlt*

Librairie : Gdi32.dll

Versions :
. Windows 95/98 : Oui
. Windows NT : A partir de 3.1
. Windows 2000/XP : Oui

Description :
(origine : Phil - plancon@onetelnet.fr)
La fonction Bitblt permet de copier une image dans un conteneur image (PictureBox, Image, Form,...). Cette fonction préservera les dimensions de l'image.
Plusieurs options de copie sont possibles à l'aide du paramètre dwRop.
hDestDC : Endroit où l'image sera copiée (ex: form1.hdc, picture1.hdc).
x : Coordonnée en x du coin supérieur gauche d'où l'image sera copiée.
y : Coordonnée en y du coin supérieur gauche d'où l'image sera copiée.
nWidth : Largeur de l'image.
nHeight : Hauteur de l'image.
hSrcDC : Endroit d'où l'on prend l'image.
xSrc : Coordonnée en x du coin supérieur gauche de l'image source.
ySrc : Coordonnée en y du coin supérieur gauche de l'image source.
dwRop : Méthode utilisée pour copier l'image, voir la liste des constantes ci-dessous.

Constante | Valeur | Définition
SRCAND | &H8800C6 | Combine source et destination avec l'opérateur logique AND.
SRCCOPY | &HCC0020 | Copie l'image source intégralement sans se soucier de l'image de destination.
SRCERASE | &H440328 | Combine source et l'inversion de la destination avec l'opérateur logique AND.
SRCINVERT | &H660046 | Combine source et destination avec l'opérateur logique XOR.
SRCPAINT | &HEE0086 | Combine source et destination avec l'opérateur logique OR.
NOTSRCCOPY | &H330008 | Copie l'image source inversée sans se soucier de l'image de destination.
NOTSRCERASE | &H1100A6 | Combine source et destination avec l'opérateur logique OR puis inversion.
MERGEPAINT | &HBB0226 | Combine le source inversé et l'image de destination avec l'opérateur logique OR.
DSTINVERT | &H550009 | Inversion de l'image de destination sans se soucier du source.
BLACKNESS | &H42 | Tout en noir.
WHITENESS | &HFF0062 | Tout en blanc.

Exemple d'utilisation :
include gdi.inc
includelib gdi.lib


CloseHandle

CloseHandle,hObjet

Librairie: Kernel32.dll

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:

La fonction CloseHandle sert à fermer l'identifiant d'un objet ouvert.

Paramètres:

hObjet
Handle de l'objet à fermer

Valeur retournée:
Si la fonction réussie elle retourne True.
Si la fonction échoue,la valeur de retour est False, pour obtenir plus de détail sur l'erreur faite appel à la fonction GetLastError

Remarques:

Cette fonction vous permet d'agir sur les objets suivants:
· Console (entrée/sortie)
· Event file
· File mapping
· Mutex
· Named pipe
· Processus
· Semaphore
· Thread
CloseHandle est courament utilisée pour fermer les handles returné par la fonction CreateFile.

Exemple:
Pas d'exemple disponible pour le moment.

Voir aussi

CreateFile, DeleteFile


CreateFile *

CreateFile
LPCTSTR lpFileName, // Pointeur vers le nom du fichier
DWORD dwDesiredAccess, // Mode d'acces (lecture / écriture)
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // addresse du descriptuer de sécurité
DWORD dwCreationDistribution, //
DWORD dwFlagsAndAttributes, //Attribut de fichier
HANDLE hTemplateFile // handle du fichier à copier

Librairie: Kernel32.dll

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:

La fonction CreateFile permet de créer, d'ouvrir ou de tronquer un fichier, pipe, communications resource, disk device, ou console. Elle returne un handle pour accéder à l'object. Elle peux aussi ouvir et retourner un handle de repertoire.

Paramètres:

 lpFileName
Pointeur vers une chaine de caractères (terminée par un 0) contenant le nom du fichier, pipe, communications ressource, disk device ou console à créer/ouvrir ou tronquer.
Si *lpFileName est un chemin la taille limite par defaut est MAX_PATH caractères (260).
Windows NT: You can transcend this limit and send in paths longer than MAX_PATH characters by calling the wide (W) version of CreateFile and prepending "\\?\" to the path. The "\\?\" tells the function to turn off path parsing. This lets you use paths that are nearly 32k Unicode characters long. You must use fully-qualified paths with this technique. This also works with UNC names. The "\\?\" is ignored as part of the path. For example, "\\?\C:\myworld\private" is seen as "C:\myworld\private", and "\\?\UNC\tom_1\hotstuff\coolapps" is seen as "\\tom_1\hotstuff\coolapps".

dwDesiredAccess
Spécifie le type d'acces de l'objet. Une application peut obtenir l'acces en lecture, écriture, les deux ou " device query access".
0 Allows an application to query device attributes without actually accessing the device.
GENERIC_READ Acces en lecture.
GENERIC_WRITE Acces en écriture
Note: pour accéder en lecture et écriture il suffit de combiner les 2 constantes avec l'opérateur logique Ou (Or), GENERIC_READ or GENERIC_WRITE

dwShareMode
Specifies how this file can be shared. This parameter must be some combination of the following values:
Value Meaning
0 Prevents the file from being shared.
FILE_SHARE_READ Other open operations can be performed on the file for read access. If the CreateFile function is opening the client end of a mailslot, this flag is specified.
FILE_SHARE_WRITE Other open operations can be performed on the file for write access.
lpSecurityAttributes

Points to a SECURITY_ATTRIBUTES structure that specifies the security attributes for the file. The file system must support this parameter for it to have an effect.

dwCreationDistribution

Specifies which action to take on files that exist, and which action to take when files do not exist. For more information about this parameter, see the following Remarks section. This parameter must be one of the following values:

Value Meaning
CREATE_NEW Creates a new file. The function fails if the specified file already exists.
CREATE_ALWAYS Creates a new file. The function overwrites the file if it exists.
OPEN_EXISTING Opens the file. The function fails if the file does not exist.
See the "Remarks" section, following, for a discussion of why you should use the OPEN_EXISTING flag if you are using the CreateFile function for a device, including the console.
OPEN_ALWAYS Opens the file, if it exists. If the file does not exist, the function creates the file as if dwCreationDistribution were CREATE_NEW.
TRUNCATE_EXISTING Opens the file. Once opened, the file is truncated so that its size is zero bytes. The calling process must open the file with at least GENERIC_WRITE access. The function fails if the file does not exist.
dwFlagsAndAttributes

Specifies the file attributes and flags for the file.
Any combination of the following attributes is acceptable, except all other file attributes override FILE_ATTRIBUTE_NORMAL.

Attribute Meaning
FILE_ATTRIBUTE_ARCHIVE The file is an archive file. Applications use this attribute to mark files for backup or removal.
FILE_ATTRIBUTE_COMPRESSED The file or directory is compressed. For a file, this means that all of the data in the file is compressed. For a directory, this means that compression is the default for newly created files and subdirectories.
FILE_ATTRIBUTE_NORMAL The file has no other attributes set. This attribute is valid only if used alone.
FILE_ATTRIBUTE_HIDDEN The file is hidden. It is not to be included in an ordinary directory listing.
FILE_ATTRIBUTE_READONLY The file is read only. Applications can read the file but cannot write to it or delete it.
FILE_ATTRIBUTE_SYSTEM The file is part of or is used exclusively by the operating system.
Any combination of the following flags is acceptable.

Flag Meaning
FILE_FLAG_WRITE_THROUGH
Instructs the operating system to write through any intermediate cache and go directly to the file. The operating system can still cache write operations, but cannot lazily flush them.
FILE_FLAG_OVERLAPPED
Instructs the operating system to initialize the file, so ReadFile, WriteFile, ConnectNamedPipe, and TransactNamedPipe operations that take a significant amount of time to process return ERROR_IO_PENDING. When the operation is finished, an event is set to the signaled state.
When you specify FILE_FLAG_OVERLAPPED, the ReadFile and WriteFile functions must specify an OVERLAPPED structure. That is, when FILE_FLAG_OVERLAPPED is specified, an application must perform overlapped reading and writing.
When FILE_FLAG_OVERLAPPED is specified, the operating system does not maintain the file pointer. The file position must be passed as part of the lpOverlapped parameter (pointing to an OVERLAPPED structure) to the ReadFile and WriteFile functions.
This flag also enables more than one operation to be performed simultaneously with the handle (a simultaneous read and write operation, for example).
FILE_FLAG_NO_BUFFERING
Instructs the operating system to open the file with no intermediate buffering or caching. This can provide performance gains in some situations. An application must meet certain requirements when working with files opened with FILE_FLAG_NO_BUFFERING:· File access must begin at offsets within the file that are integer multiples of the volume's sector size. · File access must be for numbers of bytes that are integer multiples of the volume's sector size. For example, if the sector size is 512 bytes, an application can request reads and writes of 512, 1024, or 2048 bytes, but not of 335, 981, or 7171 bytes. · Buffer addresses for read and write operations must be aligned on addresses in memory that are integer multiples of the volume's sector size. An application can determine a volume's sector size by calling the GetDiskFreeSpace function.
FILE_FLAG_RANDOM_ACCESS
Indicates that the file is accessed randomly. Windows uses this flag to optimize file caching.
FILE_FLAG_SEQUENTIAL_SCAN
Indicates that the file is to be accessed sequentially from beginning to end. Windows uses this flag to optimize file caching. If an application moves the file pointer for random access, optimum caching may not occur; however, correct operation is still guaranteed.
Specifying this flag can increase performance for applications that read large files using sequential access. Performance gains can be even more noticeable for applications that read large files mostly sequentially, but occasionally skip over small ranges of bytes.
FILE_FLAG_DELETE_ON_CLOSE
Indicates that the operating system is to delete the file immediately after all of its handles have been closed.If you use this flag when you call CreateFile, then open the file again, and then close the handle for which you specified FILE_FLAG_DELETE_ON_CLOSE, the file will not be deleted until after you have closed the second and any other handle to the file.
FILE_FLAG_BACKUP_SEMANTICS
Windows NT only: Indicates that the file is being opened or created for a backup or restore operation. The operating system ensures that the calling process overrides file security checks, provided it has the necessary permission to do so. The relevant permissions are SE_BACKUP_NAME and SE_RESTORE_NAME.A Windows NT application can also set this flag to obtain a handle to a directory. A directory handle can be passed to some Win32 functions in place of a file handle.
FILE_FLAG_POSIX_SEMANTICS
Indicates that the file is to be accessed according to POSIX rules. This includes allowing multiple files with names, differing only in case, for file systems that support such naming. Use care when using this option because files created with this flag may not be accessible by applications written for MS-DOS, Windows 3.x, or Windows NT.
If the CreateFile function opens the client side of a named pipe, the dwFlagsAndAttributes parameter can also contain Security Quality of Service information. When the calling application specifies the SECURITY_SQOS_PRESENT flag, the dwFlagsAndAttributes parameter can contain one or more of the following values:

Value Meaning
SECURITY_ANONYMOUS Specifies to impersonate the client at the Anonymous impersonation level.
SECURITY_IDENTIFICATION Specifies to impersonate the client at the Identification impersonation level.
SECURITY_IMPERSONATION Specifies to impersonate the client at the Impersonation impersonation level.
SECURITY_DELEGATION Specifies to impersonate the client at the Delegation impersonation level.
SECURITY_CONTEXT_TRACKING Specifies that the security tracking mode is dynamic. If this flag is not specified, Security Tracking Mode is static.
SECURITY_EFFECTIVE_ONLY Specifies that only the enabled aspects of the client's security context are available to the server. If you do not specify this flag, all aspects of the client's security context are available.This flag allows the client to limit the groups and privileges that a server can use while impersonating the client.
For more information, see Security.

hTemplateFile

Specifies a handle with GENERIC_READ access to a template file. The template file supplies extended attributes for the file being created.

Valeur retournée:
Si la fonction réussie elle retourne un handle valide
Si la fonction échoue,la valeur de retour est INVALID_HANDLE_VALUE (-1) et le détail est disponible en appelant la fonction GetLastError.

Remarques:

Tronquer un fichier ? En fait lorsque l'on modifie un fichier si les nouvelles données utilisent moins d'espace sans la troncature les anciennes données resteraient écrites apres nos données, alors qu'avec la troncature la taille du fichier est révisée.

Exemple:
Pas d'exemple disponible pour le moment.

Voir aussi

AllocConsole, CloseHandle, ConnectNamedPipe, CreateDirectory, CreateDirectoryEx, CreateNamedPipe, DeviceIOControl, GetDiskFreeSpace, GetOverlappedResult, GetStdHandle, OpenFile, OVERLAPPED, ReadFile, SECURITY_ATTRIBUTES, SetStdHandle TransactNamedPipe, VirtualAlloc, WriteFile


DialogBoxParam

DialogBoxParam,HINSTANCE,LPCTSTR,HWND,DLGPROC,LPARAM

Librairie: User32.dll

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:
DialogBoxParam, fonction à appeler pour créer une boite dialogue a partir d'une ressource. voir exemple.

Paramètres:
hInstance
Identifiant(handle) de l'executable appelant la fonction. voir GetModuleHandle.

LPCTSTR
Identifiant de notre ressource.

HWND
Identifiant de la fenêtre mère.Mettre Null si votre boite n'est pas la fille d'une autre fenêtre.

DLGPROC
Pointeur vers une procédure DialogProc pour recevoir les messages envoyé à notre boitede dialogue.

LPARAM
Utile pour passer des paramètres au message WM_INITDIALOG reçu à l'initialisation de notre boite de dialogue.

Valeur retournée:
Comme d'habitude eax contiendra la valeur de retour
Si la fonction réussie, la valeur de retour sera celle passée à la fonction EndDialog utilisé pour terminer notre boite de dialogue.
Si la fonction échoue la valeur de retour sera -1.

Remarques:
Windows 95: Supporte un maximum de 16,364 handles.
La fonction DialogBoxParam utilise la fonction CreateWindowEx.

Exemple:
Code généralement rencontré à la création d'une boite de dialogue.

DlgProc PROTO :HWND,:UINT,:WPARAM,:LPARAM ;prototypage de la procedure traitant les messages
.const
ID_DIALOG equ 1000 ;identifiant de notre ressource
.data?
hInstance dd ?
.code
 invoke DialogBoxParam,hInstance,ID_DIALOG,NULL,addr DlgProc,NULL
;exemple de procédure recevant les messages retournés à notre fonction
DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
mov eax,uMsg
.if eax==WM_INITDIALOG
.elseif eax==WM_COMMAND
.elseif eax==WM_CLOSE
invoke EndDialog,hWin,0
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp

Voir aussi

CreateWindowEx, DialogBox, DialogBoxIndirect, DialogBoxIndirectParam, DialogProc, EndDialog, MAKEINTRESOURCE, WM_INITDIALOG, WM_SETFONT


ExitProcess

ExitProcess,uExitCode

Librairie: Kernel32.dll

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:
ExitProcess, ferme un process et ses dépendances (threads).

uExitCode, permet de spécifié le code de sortie pour le process a terminer et ses threads.Utilisez la fonction GetExitCodeProcess pour obtenir le code de sortie process et GetExitCodeThread pour obtenir le code sortie thread.

Exemple:
Code généralement rencontré à la fermeture d' applications.

invoke ExitProcess,0

 invoke ExitProcess,eax

Voir aussi

CreateProcess, CreateRemoteThread, CreateThread, ExitThread, GetExitCodeProcess, GetExitCodeThread, OpenProcess, TerminateProcess


GetLastError

GetLastError

Librairie: Kernel32.dll

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:

La fonction GetLastError retourne la dernière erreur système liée au thread courant.

Paramètres:

Aucun

Valeur retournée:
La valeur de retour sera un mot de 32bits correspondant à l'erreur et propre a chaque fonction ou parfois famille de fonction.

Remarques:

Les codes d'erreurs peuvent-être différent d'un os à un autre.

Exemple:
Pas d'exemple disponible pour le moment.

Voir aussi

SetLastError, SetLastErrorEx


GetOpenFileName

GetOpenFileName
LPOPENFILENAME lpofn // addresse d'une structure OPENFILENAME

Librairie: ComDlg32.dll

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:

La fonction GetOpenFileName ouvre la boite de dialogue standard " Ouvrir " (selecteur de fichier).

Paramètres:

LPOPENFILENAME
 addresse d'une structure OPENFILENAME
LOCAL ofn:OPENFILENAME

Valeur retournée:
La fonction retourne True ou False si l'utilisateur annule par exemple.
Lorsque la fonction retourne false pour avoir plus de détails sur l'erreur il faut appeller la fonction CommDlgExtendedError.

Remarques:

Pas de remarques pour le moment.

Exemple:

OpenEdit proc
LOCAL ofn:OPENFILENAME
LOCAL hFile:DWORD
LOCAL editstream:EDITSTREAM
LOCAL buffer[MAX_PATH]:BYTE
LOCAL chrg:CHARRANGE

 ;Zero out the ofn struct
    invoke RtlZeroMemory,addr ofn,sizeof ofn
;remplir la structure ofn
    mov ofn.lStructSize,sizeof ofn
    push hWnd
    pop ofn.hwndOwner
    push hInstance
    pop ofn.hInstance
    mov ofn.lpstrFilter,NULL
    mov buffer[0],0
    lea eax,buffer
    mov ofn.lpstrFile,eax
    mov ofn.nMaxFile,sizeof buffer
    mov ofn.lpstrDefExt,NULL
    mov ofn.Flags,OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST
;Ouvre la boite de dialogue
    invoke GetOpenFileName,addr ofn
    .if eax
;Ouvre le fichier
        invoke CreateFile,addr buffer,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
        .if eax!=INVALID_HANDLE_VALUE
        mov hFile,eax
;Copy buffer to FileName
        invoke lstrcpy,addr FileName,addr buffer
;stream the text into the richedit control
        push hFile
        pop editstream.dwCookie
        mov editstream.pfnCallback,offset StreamInProc
        invoke SendMessage,hREd,EM_STREAMIN,SF_TEXT,addr editstream
        invoke CloseHandle,hFile
        invoke SendMessage,hREd,EM_SETMODIFY,FALSE,0
        mov chrg.cpMin,0
        mov chrg.cpMax,0
        invoke SendMessage,hREd,EM_EXSETSEL,0,addr chrg
        invoke SetWinCaption
        mov eax,FALSE
        .else
        invoke MessageBox,hWnd,addr OpenFileFail,addr AppName,MB_OK
        mov eax,TRUE
        .endif
    .endif
    ret

OpenEdit endp

Voir aussi

CommDlgExtendedError, EndDialog, GetSaveFileName, OPENFILENAME


GetExitCode*

GetExitCode,hProcess,lpExitCode

Librairie: Kernel32.dll

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:

La fonction GetExitCodeProcess retourne le status de terminaison du processus spécifié.

Paramètres:

hProcess
Identifiant du processus. Le handle doit permettre l'acces PROCESS_QUERY_INFORMATION.

lpExitCode
Pointeur vers une variable32bits qui recevra le status de terminaison du processus.

Valeur retournée:
Si la fonction réussie elle retourne TRUE
Si la fonction échoue,la valeur de retour est False, pour obtenir plus de détail sur l'erreur faite appel à la fonction GetLastError
Remarques:

Pas de remarques traduite pour le moment.

If the specified process has not terminated, the termination status returned is STILL_ACTIVE. If the process has terminated, the termination status returned may be one of the following:

· The exit value specified in the ExitProcess or TerminateProcess function.
· The return value from the main or WinMain function of the process.
· The exception value for an unhandled exception that caused the process to terminate.

Exemple:
Pas d'exemple disponible pour le moment.

Voir aussi

ExitProcess, ExitThread, TerminateProcess, WinMain


GetDlgItem*

HWND hDlg, // handle de la boite de dialogue
int nIDDlgItem // identifiant du control

Librairie: User32.dll

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:

La fonction GetDlgItem retourne le handle d'un objet d'une boite de dialogue, permet par exemple d'obtenir le handle d'un bouton que l'on aurait placé dans une boite de dialogue.

Paramètres:

hDlg

Handle de la boite de dialogue contenant le control.

nIDDlgItem

Identifiant du control.

Valeur retournée:
Si la fonction réussie, la valeur retournée est le window handle du control.
Si la fonction échoue, la valeur retournée sera NULL, Indicant un control invalid ou inexistant.

Remarques:

You can use the GetDlgItem function with any parent-child window pair, not just with dialog boxes. As long as the hDlg parameter specifies a parent window and the child window has a unique identifier (as specified by the hMenu parameter in the CreateWindow or CreateWindowEx function that created the child window), GetDlgItem returns a valid handle to the child window.

Exemple:
invoke GetDlgItem,hWin,ID_BTONOK

Voir aussi

CreateWindow, CreateWindowEx, GetDlgItemInt, GetDlgItemText


GetFileSize

GetFileSize
HANDLE hFile, // handle du fichier
LPDWORD lpFileSizeHigh

Retour eax = DWORD

Librairie: Kernel32.dll

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:

La fonction GetFileSize retourne en octet la taille du fichier spécifié.

Paramètres:

hFile
Handle d'un fichier ouvert, pour lequel nous souhaitons connaître sa taille.

lpFileSizeHigh

Pointeur vers une variable where the high-order word of the file size is returned. This parameter can be NULL if the application does not require the high-order word.

Valeur retournée:
Si la fonction réussie elle retourne
Si la fonction échoue,la valeur de retour est
If the function réussie, la valeur de retour est la taille du fichier, et , si lpFileSizeHigh n'est pas NULL, la fonction met le "high-order doubleword" de la taille du fichier dans la variable pointer par lpFileSizeHigh.
Si la fonction échoue et lpFileSizeHigh est NULL, la valeur de retour est 0xFFFFFFFF. Pour obtenir les détails il suffit de faire appel à la fonction GetLastError. , si lpFileSizeHigh n'est pas NULL, la valeur de retour est 0xFFFFFFFF et la fonction GetLastError doit retourner une valeur autre que NO_ERROR.
Remarques:

La fonction GetFileSize retourne la taille décompressé des fichiers, pour obtenir la taille compressé du fichier il vous faudra faire appel à la fonction GetCompressedFileSize.

Exemple:
Pas d'exemple disponible pour le moment.

Voir aussi

GetCompressedFileSize, GetFileType


GetModuleHandle

GetModuleHandle,LPCTSTR

Librairie: Kernel32.dll

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:
GetModuleHandle, retourne un handle "process" unique. La Fonction retourne le handle si ok sinon elle retourne la valeur NULL.
LPCTSTR, adresse d'une chaine terminé par un 0, cette chaine peut recevoir le nom de l'application pour obtenir son handle si celle-ci est ouverte, l'extention peut-etre omise (.dll par defaut)

Exemple:
Code généralement rencontré à l'ouverture de notre application, hInstance contiendra le handle attribué a notre application pour pouvoir réutiliser ce handle lors d'appel à d'autres fonctions comme par exemple DialogBoxParam pour créer une boite de dialogue.

.data?
hInstance dd ?
.code
invoke GetModuleHandle,NULL
mov hInstance,eax


GlobalAlloc

GlobalAlloc
UINT uFlags, // object allocation attributs
DWORD dwBytes // nombre d'octet à reserver

Librairie: Kernel32.dll

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:

La fonction GlobalAlloc reserve le nombre d'octets demandé en mémoire.

Paramètres:

uFlags
Spécifie comment allouer la mémoire.La valeur par défaut est GMEM_FIXED. En dehors des combinaisons incompatibles il est possible d'associer plusieurs flags.

FLAG | Description | Incompatible avec
GMEM_FIXED | Allocation mémoire non déplaçable. La valeur de retour est un pointeur vers l'espace mémoire reservé. | GMEM_MOVEABLE , GMEM_DISCARDABLE
GMEM_MOVEABLE | Alloue un espace mémoire déplaçable, la fonction retourne un handle.Pour obtenir un pointeur utiliser la fonction GlobalLock | GMEM_FIXED
GPTR | Combine les flags GMEM_FIXED et GMEM_ZEROINIT |
GHND | Combine les flags GMEM_MOVEABLE et GMEM_ZEROINIT |
GMEM_DDESHARE | Allocates memory to be used by the dynamic data exchange (DDE) functions for a DDE conversation. Unlike Windows version 3. x, this memory is not shared globally. However, this flag is available for compatibility purposes. It may be used by some applications to enhance the performance of DDE operations and should, therefore, be specified if the memory is to be used for DDE. Only processes that use DDE or the clipboard for interprocess communications should specify this flag. |
GMEM_DISCARDABLE | Autorise la fragmentation de l'espace reservé. | GMEM_FIXED
GMEM_LOWER | obsolète, reste résent pour la compatibilitée avec d'ancien programme pour windows 3.x |
GMEM_NOCOMPACT | Demande a ce que l'espace mémoire reservé ne soit ni compacté ni fragmenté. |
GMEM_NODISCARD | Demande a ce que l'espace mémoire reservé ne soit pas fragmenté. |
GMEM_NOT_BANKED | obsolète, reste résent pour la compatibilitée avec d'ancien programme pour windows 3.x |
GMEM_NOTIFY | obsolète, reste résent pour la compatibilitée avec d'ancien programme pour windows 3.x |
GMEM_SHARE | Identique à GMEM_DDESHARE |
GMEM_ZEROINIT | Initialise l'espace mémoire à 0. |

dwBytes

Renseigne le nombre d'octets à reserver. Si ce paramètre est à 0 et le parametre uFlags est GMEM_MOVEABLE , la fonction returnera un identifiant (handle) vers un objet mémoire marqué comme fragmentable (discarded).

Valeur retournée:
Si la fonction réussie elle retourne l'identifiant (handle) objet de l'espace reservé, ou directement un pointeur vers l'espace mémoire reservé (voir flags).
Si la fonction échoue,la valeur de retour est NULL et pour obtenir plus de détail sur l'erreur il suffit d'appeller la fonction GetLastError.
Remarques:

Si l'espace mémoire n'est pas suffisant la fonction retournera NULL.
All memory is created with execute access; no special function is required to execute dynamically generated code.
Memory allocated with this function is guaranteed to be aligned on an 8-byte boundary.
Les fonctions GlobalAlloc et LocalAlloc sont "limitées" a un nombre de handles mémoire total de 65,536 (GMEM_MOVEABLE et LMEM_MOVEABLE) par processus. Cette limitation ne s'applique pas au mode GMEM_FIXED ou LMEM_FIXED puisque la fonction retourne un pointeur directement.

Exemple:
Pas d'exemple disponible pour le moment.

Voir aussi

GlobalFree, GlobalLock, GlobalReAlloc, GlobalSize, LocalAlloc


GlobalLock*

GlobalLock
HGLOBAL hMem adresse de la mémoire

Librairie: Kernel32.dll

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:

La fonction GlobalLock vérouille un objet mémoire et retourne un pointeur au début du segment mémoire vérouillé.The memory block associated with a locked memory object cannot be moved or discarded. For memory objects allocated with the GMEM_MOVEABLE flag, the function increments the lock count associated with the memory object.

Paramètres:

hMem
Identifiant de l'objet mémoire a vérouiller. Cette identifiant est retournée par les fonctions GlobalAlloc ou GlobalReAlloc.

Valeur retournée:
Si la fonction réussie la valeur de retour est un pointeur vers le premier octet de l'objet mémoire vérouillé.
Si la fonction échoue la valeur de retour est NULL.Pour obtenir des informations détaillées sur l'erreur faite appel à la fonction GetLastError.
Remarques:
The internal data structures for each memory object include a lock count that is initially zero. For movable memory objects, GlobalLock increments the count by one, and the GlobalUnlock function decrements the count by one. For each call that a process makes to GlobalLock for an object, it must eventually call GlobalUnlock. Locked memory will not be moved or discarded, unless the memory object is reallocated by using the GlobalReAlloc function. The memory block of a locked memory object remains locked until its lock count is decremented to zero, at which time it can be moved or discarded.

Memory objects allocated with the GMEM_FIXED flag always have a lock count of zero. For these objects, the value of the returned pointer is equal to the value of the specified handle.
If the specified memory block has been discarded or if the memory block has a zero-byte size, this function returns NULL.
Discarded objects always have a lock count of zero.

Exemple:
Pas d'exemple disponible pour le moment.

Voir aussi

GlobalAlloc, GlobalFlags, GlobalReAlloc, GlobalUnlock


OPENFILENAME

OPENFILENAME Structure*

OPENFILENAME STRUCT
lStructSize DWORD ?
hwndOwner DWORD ?
hInstance DWORD ?
lpstrFilter DWORD ?
lpstrCustomFilter DWORD ?
nMaxCustFilter DWORD ?
nFilterIndex DWORD ?
lpstrFile DWORD ?
nMaxFile DWORD ?
lpstrFileTitle DWORD ?
nMaxFileTitle DWORD ?
lpstrInitialDir DWORD ?
lpstrTitle DWORD ?
Flags DWORD ?
nFileOffset WORD ?
nFileExtension WORD ?
lpstrDefExt DWORD ?
lCustData DWORD ?
lpfnHook DWORD ?
lpTemplateName DWORD ?
OPENFILENAME ENDS

Include: Windows.inc

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:

Définition de la structure openfilename utilisée par les fonctions GetOpenFileName et GetSaveFileName

Paramètres:

lStructSize

Specifies the length, in bytes, of the structure.

hwndOwner

Identifies the window that owns the dialog box. This member can be any valid window handle, or it can be NULL if the dialog box has no owner.

hInstance

Identifies a data block that contains a dialog box template specified by the lpTemplateName member (if the Flags member is set to OFN_ENABLETEMPLATE). Identifies the memory object containing a dialog box template (if Flags is set to OFN_ENABLETEMPLATEHANDLE). If neither OFN_ENABLETEMPLATE nor OFN_ENABLETEMPLATEHANDLE is set, this member is ignored.

lpstrFilter

Points to a buffer containing pairs of null-terminated filter strings. The first string in each pair describes a filter (for example, "Text Files"), and the second specifies the filter pattern (for example, "*.TXT"). Multiple filters can be specified for a single item by separating the filter pattern strings with a semicolon (for example, "*.TXT;*.DOC;*.BAK"). The last string in the buffer must be terminated by two NULL characters. If this member is NULL, the dialog box will not display any filters. The filter strings are assumed to be in the proper order ¾ the operating system does not change the order.

lpstrCustomFilter

Points to a buffer containing a pair of user-defined filter strings. The first string describes the filter, and the second specifies the filter pattern (for example "WinWord, *.docnn"). The buffer is terminated by two NULL characters. The operating system copies the strings to the buffer when the user closes the dialog box. The system uses the strings to initialize the user-defined file filter the next time the dialog box is created. If this member is NULL, the dialog box lists but does not save user-defined filter strings.

Windows 95: If this member is NULL, the member is ignored.
If this member is not NULL, the value of the nMaxCustFilter member is used to determine the length of the corresponding string.

nMaxCustFilter

Specifies the size, in bytes or characters, of the buffer identified by lpstrCustomFilter. This buffer should be at least 40 characters long. This member is ignored if lpstrCustomFilter is NULL or points to a NULL string.
Windows 95: The value of nMaxcustFilter is used whenever lpstrCustomFilter is defined.

nFilterIndex

Specifies an index into the buffer pointed to by lpstrFilter. The system uses the index value to obtain a pair of strings to use as the initial filter description and filter pattern for the dialog box. The first pair of strings has an index value of 1. When the user closes the dialog box, the system copies the index of the selected filter strings into this location. If nFilterIndex is zero, the custom filter is used. If nFilterIndex is zero and lpstrCustomFilter is NULL, the system uses the first filter in the buffer identified by lpstrFilter. If all three members are zero or NULL, the system does not use any filters and does not show any files in the file list control of the dialog box.

lpstrFile

Points to a buffer that contains a filename used to initialize the File Name edit control. The first character of this buffer must be NULL if initialization is not necessary. When the GetOpenFileName or GetSaveFileName function returns, this buffer contains the drive designator, path, filename, and extension of the selected file.
If the buffer is too small, the dialog box procedure copies the required size into this member.

nMaxFile

Windows NT: Specifies the size, in characters, of the buffer pointed to by lpstrFile. The GetOpenFileName and GetSaveFileName functions return FALSE if the buffer is too small to contain the file information. The buffer should be at least 256 characters long. This member is ignored if lpstrFile is NULL.
Windows 95: Specifies the size in bytes or characters of the buffer pointed to by lpstrFile. The buffer should be at least 260 charcters long. this member is ignored if lpstrFile is NULL.

lpstrFileTitle

Points to a buffer that receives the title of the selected file. For Windows versions 3.0 and 3.1, this buffer receives the filename and extension without path information. The application should use this string to display the file title. If this member is NULL, the function does not copy the file title.

nMaxFileTitle

Specifies the maximum length of the string that can be copied into the lpstrFileTitle buffer. This member is ignored if lpstrFileTitle is NULL.

lpstrInitialDir

Points to a string that specifies the initial file directory. If this member is NULL, the system uses the current directory as the initial directory.

lpstrTitle

Points to a string to be placed in the title bar of the dialog box. If this member is NULL, the system uses the default title (that is, "Save As" or "Open").

Flags

Specifies the dialog box creation flags. This member may be a combination of the following flags:

Constante | Valeur | Définition
OFN_ALLOWMULTISELECT | &H200 | Autoriser la sélection multiple de fichiers.
OFN_CREATEPROMPT | &H2000 | Afficher une fenêtre de confirmation de création de fichier.
OFN_EXPLORER | &H80000 | Donne un style 'Explorer' à la boîte de dialogue (par défaut).
OFN_EXTENSIONDIFFERENT | &H400 | Indique que l'utilisateur a choisi une extension différente de celle par défaut.
OFN_FILEMUSTEXIST | &H1000 | Seuls des fichiers existants peuvent être saisis.
OFN_HIDEREADONLY | &H4 | Case à cocher 'Lecture seule' invisible.
OFN_LONGNAMES | &H200000 | Gestion des noms longs pour les boîtes de dialogue n'ayant pas le style 'Explorer'.
OFN_NOCHANGEDIR | &H8 | Conserve le répertoire d'origine à la fermeture de la fenêtre.
OFN_NODEREFERENCELINKS | &H100000 | La boîte de dialogue prendra le nom et le chemin du raccourci sélectionné.
OFN_NOLONGNAMES | &H40000 | Utilise les noms courts de fichier (sans effet dans le cas des fenêtres du type 'Explorer').
OFN_NONETWORKBUTTON | &H20000 | Cache (désactive) le bouton 'Réseau'.
OFN_NOREADONLYRETURN | &H8000 | Ne sélectionne pas la case à cocher 'Lecture seule'.
OFN_NOTESTFILECREATE | &H10000 | Le fichier ne sera pas créé avant la fermeture de la fenêtre.
OFN_NOVALIDATE | &H100 | Ne vérifie pas la validité de la saisie (validité du nom de fichier).
OFN_OVERWRITEPROMPT | &H2 | Afficher un message de confirmation d'écrasement de fichier si celui-ci existe déjà.
OFN_PATHMUSTEXIST | &H800 | Les chemins et fichiers saisis doivent exister.
OFN_READONLY | &H1 | La case 'Lecture seule' est cochée à la création de la fenêtre.
OFN_SHAREAWARE | &H4000 | Ignorer les erreurs de partage réseau.
OFN_SHOWHELP | &H10 | Afficher le bouton 'Aide' dans la boîte de dialogue.

nFileOffset

Specifies a zero-based offset from the beginning of the path to the filename in the string pointed to by lpstrFile. For example, if lpstrFile points to the following string, "c:\dir1\dir2\file.ext", this member contains the value 13.

nFileExtension

Specifies a zero-based offset from the beginning of the path to the filename extension in the string pointed to by lpstrFile. For example, if lpstrFile points to the following string, "c:\dir1\dir2\file.ext", this member contains the value 18. If the user did not type an extension and lpstrDefExt is NULL, this member specifies an offset to the terminating null character. If the user typed "." as the last character in the filename, this member specifies 0.

lpstrDefExt

Points to a buffer that contains the default extension. GetOpenFileName and GetSaveFileName append this extension to the filename if the user fails to type an extension. This string can be any length, but only the first three characters are appended. The string should not contain a period (.). If this member is NULL and the user fails to type an extension, no extension is appended.

lCustData

Specifies application-defined data that the operating system passes to the hook function identified by lpfnHook. The system passes the data in the lParam parameter of the WM_INITDIALOG message.

lpfnHook

Points to a hook function that processes messages intended for the dialog box. An application must specify the OFN_ENABLEHOOK flag in the Flags member to enable the function; otherwise, the operating system ignores this structure member. The hook function should return FALSE to pass a message to the standard dialog box procedure or TRUE to discard the message.
If the hook function processes WM_CTLCOLOR* messages (such as WM_CTLCOLORDLG), the function must return a valid brush handle for painting the background of the dialog box or the corresponding control.

lpTemplateName

Points to a null-terminated string that names the dialog box template to be substituted for the standard dialog box template. An application can use the MAKEINTRESOURCE macro for numbered dialog box resources. This member is only used if Flags specifies the OFN_ENABLETEMPLATE flag; otherwise, this member is ignored.

Exemple:

OpenEdit proc
LOCAL ofn:OPENFILENAME
LOCAL hFile:DWORD
LOCAL editstream:EDITSTREAM
LOCAL buffer[MAX_PATH]:BYTE
LOCAL chrg:CHARRANGE

 ;Zero out the ofn struct
    invoke RtlZeroMemory,addr ofn,sizeof ofn
;remplir la structure ofn
    mov ofn.lStructSize,sizeof ofn
    push hWnd
    pop ofn.hwndOwner
    push hInstance
    pop ofn.hInstance
    mov ofn.lpstrFilter,NULL
    mov buffer[0],0
    lea eax,buffer
    mov ofn.lpstrFile,eax
    mov ofn.nMaxFile,sizeof buffer
    mov ofn.lpstrDefExt,NULL
    mov ofn.Flags,OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST
;Ouvre la boite de dialogue
    invoke GetOpenFileName,addr ofn

Voir aussi

GetOpenFileName, GetSaveFileName


ReadFile*

ReadFile,hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,lpOverlapped
HANDLE hFile, // handle du fichier à lire
LPVOID lpBuffer, // addresse du buffer qui recevra les données
DWORD nNumberOfBytesToRead, // nombre d'octet à lire
LPDWORD lpNumberOfBytesRead, // address of number of bytes read
LPOVERLAPPED lpOverlapped // address of structure for data

Librairie: Kernel32.dll

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:

La fonction ReadFile lis les données d'un fichier, la lecture commence à la position indiquée par le pointeur de fichier. Une fois la lecture terminée, le pointeur de fichier est ajusté au nombre d'octet actuellement lus, dans le cas ou le handle de fichier est créer sans l'attribut overlapped. Si le handle de fichier est crée pour réecrire (écrasé attribut overlapped), l'application doit adjuster la position du pointeur de fichier après l'opération de lecture.

Paramètres:

hFile
Handle identifiant le fichier à lire. Le handle doit-être crée avec le mode d'acces GENERIC_READ.

Windows NT
For asynchronous read operations, hFile can be any handle opened with the FILE_FLAG_OVERLAPPED flag by the CreateFile function, or a socket handle returned by the socket or accept functions.

Windows 95
For asynchronous read operations, hFile can be a communications resource, mailslot, or named pipe handle opened with the FILE_FLAG_OVERLAPPED flag by CreateFile, or a socket handle returned by the socket or accept functions. Windows 95 does not support asynchronous read operations on disk files.

lpBuffer
Pointeur du buffer recevant les données lu.

nNumberOfBytesToRead
Specifies the number of bytes to be read from the file.

lpNumberOfBytesRead
Pointeur vers le nombre d'octet lu. ReadFile met cette valeur à 0 avant de commencer or error checking. If this parameter is zero when ReadFile returns TRUE on a named pipe, the other end of the message-mode pipe called the WriteFile function with nNumberOfBytesToWrite set to zero.

lpOverlapped
Pointeur vers une structure OVERLAPPED.Cette structure est nécessaire si le handle (hfile) est crée avec le FILE_FLAG_OVERLAPPED.
This parameter should not be NULL if hFile was created with FILE_FLAG_OVERLAPPED. It should point to a valid OVERLAPPED structure. If the file identified by the hFile parameter was created with FILE_FLAG_OVERLAPPED and lpOverlapped is NULL, the function fails in unpredictable ways.
If hFile was not created with FILE_FLAG_OVERLAPPED and lpOverlapped is NULL, the read operation starts at the current file position and ReadFile does not return until the operation has been completed. The function operates synchronously.

If hFile was created with FILE_FLAG_OVERLAPPED and lpOverlapped is not NULL, the read operation starts at the offset specified in the OVERLAPPED structure and ReadFile may return before the read operation has been completed. In this case, ReadFile returns FALSE and the GetLastError function returns ERROR_IO_PENDING. The calling process can continue while the read operation finishes. The event specified in the OVERLAPPED structure is set to the signaled state upon completion of the read operation.

If hFile is not created with FILE_FLAG_OVERLAPPED and lpOverlapped is not NULL, the read operation starts at the offset specified in the OVERLAPPED structure. ReadFile does not return until the read operation has been completed.

Valeur retournée:
Si la fonction réussie elle retourne TRUE. Si la fonction retourne True et
que le nombre d'octet lu est de 0, the file pointer was beyond the current end of the file at the time of the read operation.
Si la fonction échoue,la valeur de retour est FALSE, pour obtenir plus de
détails sur l'erreur vous devez appeller la fonction GetLastError.
Remarques:

If part of the file is locked by another process and the read operation overlaps the locked portion, this function fails.
Applications must not read from nor write to the input buffer that a read operation is using until the read operation completes. A premature access to the input buffer may lead to corruption of the data read into that buffer.
Characters can be read from the console input buffer by using ReadFile with a handle to console input. The console mode determines the exact behavior of the ReadFile function.

If a named pipe is being read in message mode and the next message is longer than the nNumberOfBytesToRead parameter specifies, ReadFile returns FALSE and GetLastError returns ERROR_MORE_DATA. The remainder of the message may be read by a subsequent call to the ReadFile or PeekNamedPipe function.
When reading from a communications device, the behavior of ReadFile is governed by the current communication timeouts as set and retrieved using the SetCommTimeouts and GetCommTimeouts functions. Unpredictable results can occur if you fail to set the timeout values. For more information about communication timeouts, see COMMTIMEOUTS.

If ReadFile attempts to read from a mailslot whose buffer is too small, the function returns FALSE and GetLastError returns ERROR_INSUFFICIENT_BUFFER.
If the anonymous write pipe handle has been closed and ReadFile attempts to read using the corresponding anonymous read pipe handle, the function returns FALSE and GetLastError returns ERROR_BROKEN_PIPE.
The ReadFile function may fail and return ERROR_INVALID_USER_BUFFER or ERROR_NOT_ENOUGH_MEMORY whenever there are too many outstanding asynchronous I/O requests.

If hFile is a handle to a named pipe, the Offset and OffsetHigh members of the OVERLAPPED structure pointed to by lpOverlapped must be zero, or the function will fail.
The ReadFile code to check for the end-of-file condition (eof) differs for synchronous and asynchronous read operations.
When a synchronous read operation reaches the end of a file, ReadFile returns TRUE and sets *lpNumberOfBytesRead to zero. The following sample code tests for end-of-file for a synchronous read operation:

// attempt a synchronous read operation
bResult = ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead, NULL) ;
// check for eof
if (bResult &&  nBytesRead == 0, ) {
// we're at the end of the file
}

An asynchronous read operation can encounter the end of a file during the initiating call to ReadFile, or during subsequent asynchronous operation.
If EOF is detected at ReadFile time for an asynchronous read operation, ReadFile returns FALSE and GetLastError returns ERROR_HANDLE_EOF.
If EOF is detected during subsequent asynchronous operation, the call to GetOverlappedResult to obtain the results of that operation returns FALSE and GetLastError returns ERROR_HANDLE_EOF.

The following sample code illustrates testing for end-of-file for an asynchronous read operation:

// set up overlapped structure fields
// to simplify this sample, we'll eschew an event handle
gOverLapped.Offset     = 0;
gOverLapped.OffsetHigh = 0;
gOverLapped.hEvent     = NULL;

// attempt an asynchronous read operation
bResult = ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead,
&gOverlapped) ;

// if there was a problem, or the async. operation's still pending ...
if (!bResult) {

// deal with the error code
switch (dwError = GetLastError()) {

case ERROR_HANDLE_EOF: {
// we're reached the end of the file
// during the call to ReadFile

// code to handle that
}

case ERROR_IO_PENDING: {
// asynchronous i/o is still in progress

// do something else for a while
GoDoSomethingElse() ;

// check on the results of the asynchronous read
bResult = GetOverlappedResult(hFile, &gOverlapped,
&nBytesRead, FALSE) ;

// if there was a problem ...
if (!bResult) {

// deal with the error code
switch (dwError = GetLastError()) {

case ERROR_HANDLE_EOF: {
// we're reached the end of the file
//during asynchronous operation
}

// deal with other error cases

} // end switch
} // end if
} // end case

// deal with other error cases

} // end switch
} // end if

Exemple:
Le bout de code suivant vient de la source SimEd Fournit avec Radasm
.Code
;Cette procédure est appellée par Loadfile
StreamInProc proc hFile:DWORD,pBuffer:DWORD,NumBytes:DWORD,pBytesRead:DWORD

invoke ReadFile,hFile,pBuffer,NumBytes,pBytesRead,0
xor eax,1
ret
StreamInProc endp
;La procédure loadfile appellant streaminproc
LoadFile proc uses ebx esi,hWin:DWORD,lpFileName:DWORD
LOCAL hFile:DWORD
LOCAL editstream:EDITSTREAM
LOCAL chrg:CHARRANGE

;Open the file
invoke CreateFile,lpFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
.if eax!=INVALID_HANDLE_VALUE
mov hFile,eax
;Copy buffer to FileName
invoke lstrcpy,offset FileName,lpFileName
;Set word group
invoke lstrlen,offset FileName
mov ebx,15
.if eax>3
mov esi,eax
xor ebx,ebx
invoke lstrcmpi,addr [esi+offset FileName-4],offset szFtAsm
.if eax
invoke lstrcmpi,addr [esi+offset FileName-4],offset szFtInc
.if eax
invoke lstrcmpi,addr [esi+offset FileName-3],offset szFtRc
.if !eax
;RC File
inc ebx
.else
;Unknown file type
mov ebx,15
invoke GetWindowLong,hWin,GWL_STYLE
or eax,STYLE_NOHILITE
invoke SetWindowLong,hWin,GWL_STYLE,eax
.endif
.endif
.endif
.endif
invoke SendMessage,hWin,REM_SETWORDGROUP,0,ebx
;stream the text into the RAEdit control
push hFile
pop editstream.dwCookie
mov editstream.pfnCallback,offset StreamInProc
invoke SendMessage,hWin,EM_STREAMIN,SF_TEXT,addr editstream
invoke CloseHandle,hFile
invoke SendMessage,hWin,EM_SETMODIFY,FALSE,0
mov chrg.cpMin,0
mov chrg.cpMax,0
invoke SendMessage,hWin,EM_EXSETSEL,0,addr chrg
invoke SetWinCaption,offset FileName
mov eax,FALSE
.else
invoke MessageBox,hWnd,offset OpenFileFail,offset AppName,MB_OK or MB_ICONERROR
mov eax,TRUE
.endif
ret

LoadFile endp

Voir aussi

CreateFile, GetCommTimeouts, GetOverlappedResult, OVERLAPPED, PeekNamedPipe, ReadFileEx, SetCommTimeouts, WriteFile


ShowWindow

BOOL ShowWindow (
hWnd hWnd, // handle de la fenêtre
int nCmdShow // état de l'affichage de la fenêtre
);

Librairie: User32.dll

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:

La fonction ShowWindow définit la façon dont sera affichée la fenêtre ciblée.

Paramètres:

hWnd

Identifie la fenêtre.

nCmdShow

 Spécifie comment la fenêtre doit être montrée. Ce paramètre est ignoré la première fois qu'une application appelle ShowWindow, si le programme qui a lancé cette application fournit une structure STARTUPINFO. Sinon, la première fois que ShowWindow est appelée, cette valeur doit être la valeur obtenue par la fonction WinMain (dans son paramètre nCmdShow). Dans les appels suivants, ce paramètre peut être une des valeurs suivantes :

Signification des Valeurs:

SW_HIDE Cache la fenêtre et active une autre fenêtre.
SW_MAXIMIZE Maximise la fenêtre indiquée.
SW_MINIMIZE Réduit au minimum la fenêtre indiquée et active la fenêtre suivante de plus haut niveau.
SW_RESTORE Active et affiche la fenêtre. Si la fenêtre est réduite au minimum ou maximisée, Windows la rétablit à sa taille et position originale. Une application doit spécifier ce flag en rétablissant une fenêtre réduite au minimum.
SW_SHOW Active la fenêtre et l'affiche à sa taille et position actuelle.
SW_SHOWDEFAULT Met la fenêtre à l'état d'affichage suivant le flag SW_ indiqué dans la structure STARTUPINFO qui à été passé à la fonction CreateProcess au commencement du programme.
SW_SHOWMAXIMIZED Active la fenêtre et l'affiche comme une fenêtre maximisée.
SW_SHOWMINIMIZED Active la fenêtre et l'affiche comme une fenêtre réduite au minimum.
SW_SHOWMINNOACTIVE Affiche la fenêtre comme une fenêtre réduite au minimum. Si une fenêtre est déjà active, elle reste active.
SW_SHOWNA affiche une fenêtre dans son état actuel. La fenêtre active reste active.
SW_SHOWNOACTIVATE affiche une fenêtre à sa taille et position la plus récente. La fenêtre active reste active.
SW_SHOWNORMAL Active et affiche une fenêtre. Si la fenêtre est réduite au minimum ou maximisée, Windows la rétablit à sa taille et position originale (Idem pour SW_RESTORE).

Valeur retournée:
Si la fenêtre était déjà visible, la valeur en retour est true.
Si la fenêtre a été précédemment cachée, la valeur en retour est false.

Remarques:

La première fois qu'un programme appelle ShowWindow, il emploie le paramètre nCmdShow de la fonction WinMain pour son paramètre nCmdShow. Les appels ShowWindow suivants doivent employer une des valeurs dans la liste donnée, à la place de celui indiqué par le paramètre nCmdShow appartenant à la fonction WinMain.
Comme ça a été dit à propos du paramètre nCmdShow, la valeur de nCmdShow est ignorée pour le premier appel de ShowWindow si le programme qui a lancé l'application spécifie l'information de démarrage dans une structure STARTUPINFO. Dans ce cas, ShowWindow emploie l'information indiquée dans la structure STARTUPINFO pour afficher la fenêtre. Pour les appels suivants, l'application doit appeler ShowWindow en prenant le flag SW_SHOWDEFAULT dans nCmdShow pour utiliser cette information fournie au démarrage par le programme qui a lancé l'application. Par exemple, le Gestionnaire de programmes spécifie que les applications commencent par une fenêtre réduite au minimum. Ce comportement est conçu pour les situations suivantes :

· des applications créent leur fenêtre principale en appelant CreateWindow avec le flag WS_VISIBLE posé. (ce qui fait que la fenêtre est dans un état visible et affichée)
· des applications créent leur fenêtre principale en appelant CreateWindow avec le flag WS_VISIBLE déclaré (ce qui fait que la fenêtre est dans un état visible mais en attente d'affichage), par la suite ShowWindow est appelé avec en plus le flag SW_SHOW pour la montrée.

Exemple:
Pas d'exemple disponible pour le moment.

Voir aussi

CreateProcess, CreateWindow, ShowOwnedPopups, STARTUPINFO, WinMain


Sleep

Sleep,cMilliseconds

Librairie: Kernel32.dll

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:

La fonction sleep suspend l'execution du thread courant pendant n milliseconde.

Paramètres:

cMilliseconds (DWord)
Spécifie la durée de la mise en sommeil en millisecondes.
Attention, durant toute cette période, la fenêtre de l'application ne sera pas mise à jour (rafraîchit). D'une certaine façon, l'application est gelée durant ce laps de temps.

Valeur retournée:
La fonction ne retourne pas de valeur

Remarques:

A thread can relinquish the remainder of its time slice by calling this function with a sleep time of zero milliseconds.
Je ne suis pas sur, mais je crois que ça veux dire qu'un thread peut lever un précédent appel à la fonction sleep en passant 0 comme temps de sommeil.

Exemple:
Pas d'exemple disponible pour le moment.

Voir aussi

SleepEx


TextOut

TextOut,Hdc,nXStart,nYStart,LPCTSTR,cbString

Librairie: Gdi32.dll

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:

La fonction TextOut écris une chaine de caractères à la position spécifiée,elle utilise la fonte(police) courante.

Paramètres:

Hdc
Handle du contexte sur lequel on veux écrire.

nXStart
Spécifie la coordonnée en X que windows utilisera pour aligner notre chaine.

nYStart
Spécifie la coordonnée enY que windows utilisera pour aligner notre chaine.

lpString

Pointeur de la chaine à écrire, il n'est pas necessaire qu'elle se termine par un 0.

cbString
Specifie le nombre de caractères à écrire.

Valeur retournée:
Si la fonction réussie elle retourne True.
Si la fonction échoue,la valeur de retour est False, pour obtenir plus de détail sur l'erreur faite appel à la fonction GetLastError

Remarques:

Pas de remarques pour le moment.

Exemple:
Pas d'exemple disponible pour le moment.

Voir aussi

GetTextAlign, SetTextAlign, TabbedTextOut


WindowStyle

Windows Style et style étendu*

Résumé des bits du flag Windows Style

Bit | Hexa | Equivalence | Note
0 | 1h | DS_ABSALIGN |
1 | 2h | DS_SYSMODAL |
2 | 4h | DS_3DLOOK | Aspect 3D
3 | 8h | DS_FIXEDSYS |
4 | 10h | DS_NOFAILCREATE |
5 | 20h | DS_LOCALEDIT |
6 | 40h | DS_SETFONT |
7 | 80h | DS_MODALFRAME | Boite de dialogue modal
8 | 100h | DS_NOIDLEMSG |
9 | 200h | DS_SETFOREGROUND |
10 | 400h | DS_CONTROL |
11 | 800h | DS_CENTER | Centre la fenêtre à l'écran lors de la premère ouverture
12 | 1000h | DS_CENTERMOUSE | Centre la fenêtre sur la souris lors de la première ouverture
13 | 2000h | DS_CONTEXTHELP | Aide contextuelle
14 | 4000h |  |
15 | 8000h |  |
16 | 10000h | WS_MAXIMIZEBOX | Maximise bouton
17 | 20000h | WS_MINIMIZEBOX | Minimise bouton
18 | 40000h | WS_THICKFRAME |
19 | 80000h | WS_SYSMENU | Menu
20 | 100000h | WS_HSCROLL | Barre de défilement Horizontale
21 | 200000h | WS_VSCROLL | Barre de défilement Verticale
22 | 400000h | WS_DLGFRAME | WS_CAPTION equ 0C00000h
23 | 800000h | WS_BORDER |
24 | 1000000h | WS_MAXIMIZE | Fenêtre en plein écran lors du premier affichage
25 | 2000000h | WS_CLIPCHILDREN |
26 | 4000000h | WS_CLIPSIBLINGS |
27 | 8000000h | WS_DISABLED | Fenêtre désactivée
28 | 10000000h | WS_VISIBLE | Fenêtre Visible
29 | 20000000h | WS_MINIMIZE | Fenêtre réduite lors du premier affichage
30 | 40000000h | WS_CHILD | Fenêtre fille
31 | 80000000h | WS_POPUP | Fenêtre Popup

Resumé des bits du flag Windows Ex Style

Bit | Hexa | Equivalence | Note
0 | 1h | WS_EX_DLGMODALFRAME | Boite de dialogue modal
1 | 2h |  |
2 | 4h | WS_EX_NOPARENTNOTIFY |
3 | 8h | WS_EX_TOPMOST | Toujours au top (devant)
4 | 10h | WS_EX_ACCEPTFILES | Accepte le drag and drop
5 | 20h | WS_EX_TRANSPARENT |
6 | 40h | WS_EX_MDICHILD | Fille d'une Mdi
7 | 80h | WS_EX_TOOLWINDOW | ToolWindow (petite barre de titre)
8 | 100h | WS_EX_WINDOWEDGE |
9 | 200h | WS_EX_CLIENTEDGE |
10 | 400h | WS_EX_CONTEXTHELP | Aide contextuelle disponible
11 | 800h |  |
12 | 1000h | WS_EX_RIGHT |
13 | 2000h | WS_EX_RTLREADING |
14 | 4000h | WS_EX_LEFTSCROLLBAR |
15 | 8000h |  |
16 | 10000h | WS_EX_CONTROLPARENT |
17 | 20000h | WS_EX_STATICEDGE |
18 | 40000h | WS_EX_APPWINDOW |
19 | 80000h | WS_EX_LAYERED |
20 | 100000h | WS_EX_NOINHERITLAYOUT |
21 | 200000h |  |
22 | 400000h | WS_EX_LAYOUTRTL |
23 | 800000h |  |
24 | 1000000h |  |
25 | 2000000h |  |
26 | 4000000h |  |
27 | 8000000h | WS_EX_NOACTIVATE |
28 | 10000000h |  |
29 | 20000000h |  |
30 | 40000000h |  |
31 | 80000000h |  |

Il existe d'autres equivalences combinant plusieurs de ces flags, un travail de plus à faire.

Vous pouvez cependant créer vous même vos constantes en combinant les equivalences windows via le ou logique (Or).

Ici un jour il y'aura les tableaux notifiant les styles propres aux composants, bouton, static, etc...


WM_INITDIALOG

WM_INITDIALOG (equ 110h)*

hwndFocus = (HWND) wParam
lInitParam = lParam

Include: Windows.inc

Versions :
 . Windows 95/98 : Oui
. Windows NT : Oui
. Windows 2000/XP : Oui

Description:

Le Message WM_INITDIALOG est envoyé à la procédure associée à la boite de dialogue immédiatement avant son affichage.La procédure utilise en génerale ce message pour initialisé les contrôles (valeur par defaut par exemple) et pour initialiser tout ce qui affecte l'apparence de la boite de dialogue.

Paramètres:

hwndFocus

Valeur de wParam. Identifiant du contrôles ayant par defaut le focus.

lInitParam
La c'est encore un peu le flou, laissez moi un peu de temps ou si vous avez une idée...
Valeur de lParam. Utilisé pour spécifier des valeurs additionnel d'initialisation.Ces valeurs sont passée à windows comme lParamInit lors d'un appel aux fonctions CreateDialogIndirectParam, CreateDialogParam, DialogBoxIndirectParam, ou DialogBoxParam function used to create the dialog box. This parameter is zero if any other dialog box creation function is used.

Valeur retournée:
La Procédure de dialog doit retournée TRUE pour que Windows définisse le focus (clavier) sur le controle notifié par hwndFocus. Sinon, elle doit retournée FALSE pour que windows ne définisse pas le focus (voir remarques).

Remarques:
Le contrôle recevant le focus est toujours le premier contrôle visible ayant le style WS_TABSTOP et enabled.
Quand la procédure renvois true, windows vérifie que la procédure n'a pas mis disabled(inactif) le contrôle devant recevoir le focus, sinon windows met le focus sur l'objet suivant (enabled/WS_TABSTOP/Visible)etc...
Une application peut retourner FALSE seulement si elle a positionné le focus elle même sur un contrôle.
Il faut bien comprendre que l'on parle de boite de dialogue et non pas de fenêtre.

Exemple:

WndProc proc uses ebx esi edi,hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

    mov eax,uMsg
    .if eax==WM_SIZE
    .elseif eax==WM_INITDIALOG ;On reçoit le message WM_INITDIALOG

;A l'initialisation on peut par exemple ajouter une barre d'outil
        invoke GetDlgItem,hWin,IDC_TBR
        invoke DoToolBar,hInstance,eax
;Et pourquoi pas nommer la fenêtre celon le nom du fichier ouvert
        invoke lstrcpy,offset FileName,offset NewFile
        invoke SetWinCaption,offset FileName
    .elseif eax==WM_COMMAND
    .else
        invoke DefWindowProc,hWin,uMsg,wParam,lParam
        ret
    .endif
Ex:
 xor eax,eax
 ret
WndProc endp

Voir aussi

CreateDialogIndirectParam, CreateDialogParam, DialogBoxIndirectParam, DialogBoxParam, SetFocus


Les Messages

Lors de l'exécution d'un programme celui-ci peut recevoir et émettre toute une série de messages, il suffit de les connaîtres pour pouvoir interagir avec l'utilisateur et windows.

WM ou Windows Message

  • WM_ACTIVATE, fenêtre activé ou désactivé
  • WM_ACTIVATEAPP, application activé ou désactivé
  • WM_ASKCBFORMAT, nom du format clipboard
  • WM_CANCELJOURNAL
  • WM_CANCELMODE, touche annulation d'une boite de dialogue ou message box
  • WM_CAPTURECHANGED
  • WM_CHANGECBCHAIN
  • WM_CHAR, message de caractère transmis.
  • WM_CHARTOITEM
  • WM_CHILDACTIVATE, mdi activé
  • WM_CHOOSEFONT_GETLOGFONT
  • WM_CHOOSEFONT_SETFLAGS
  • WM_CHOOSEFONT_SETLOGFONT
  • WM_CLEAR, efface la selection d'un controle éditable
  • WM_CLOSE, fermeture
  • WM_COMMAND, message de commande
  • WM_COMPACTING, peu de mémoire disponible, demande d'en libérer
  • WM_COMPAREITEM
  • WM_CONTEXTMENU, clic droit dans la fenêtre
  • WM_COPY, copier
  • WM_CREATE, création
  • WM_CTLCOLORBTN, le bouton va être dessiné
  • WM_CTLCOLORDLG, la boite de dialogue va être dessiné
  • WM_CTLCOLOREDIT, un controle éditable va être dessiné
  • WM_CTLCOLORlistbox, le bouton va être dessiné
  • WM_DESTROY, destruction
  • WM_ENABLE, flag enable changé
  • WM_ERASEBKGND
  • WM_GETDLGCODE
  • WM_GETFONT, retourne la police d'écriture courante de la fenêtre.
  • WM_HELP
  • WM_HSCROLL
  • WM_IME_COMPOSITION
  • WM_INITDIALOG, message d'initialisation
  • WM_KEYDOWN, une touche clavier est enfoncée
  • WM_KEYUP, une touche clavier est relachée
  • WM_KILLFOCUS
  • WM_LBUTTONDBCLK, double clic du bouton gauche
  • WM_LBUTTONDOWN, bouton gauche enfoncé
  • WM_LBUTTONUP, bouton gauche relaché
  • WM_MBUTTONDBCLK, double clic bouton du milieu
  • WM_MBUTTONDOWN, bouton du milieu enfoncé
  • WM_MBUTTONUP, bouton du milieu relaché
  • WM_MOUSEHOVER, souris dans la zone
  • WM_MOUSELEAVE, souris quitte la zone
  • WM_MOUSEMOVE, mouvement de la souris
  • WM_NCCREATE
  • WM_NCDESTROY
  • WM_NCMOUSEMOVE, mouvement de la souris hors zone client
  • WM_NOTIFY
  • WM_NOTIFYFORMAT
  • WM_PAINT, message de redessin
  • WM_PALETTECHANGED
  • WM_PRINTCLIENT
  • WM_QUERYNEWPALETTE
  • WM_RBUTTONDBCLK
  • WM_RBUTTONDOWN
  • WM_RBUTTONUP
  • WM_SETCURSOR
  • WM_SETFOCUS
  • WM_SETFONT
  • WM_SETREDRAW
  • WM_SHOWWINDOW, la fenêtre va être montré ou cachée
  • WM_SIZE, redimensionnement
  • WM_STYLECHANGED
  • WM_STYLECHANGING
  • WM_SYSCOLORCHANGE
  • WM_SYSKEYDOWN
  • WM_TIMER, timer expiré
  • WM_VSCROLL
  • WM_WINDOWPOSCHANGED, changement de taille de position ou d'ordre
  • WM_WININICHANGE

STM ou Static Message

LVM ou List View Message


WM_Command

WM_Command (equ h)*

wNotifyCode = HIWORD(wParam); // notification code
wID = LOWORD(wParam); // item, control, or accelerator identifier
hwndCtl = (HWND) lParam; // handle du controle

Description:

Le message WM_COMMAND est envoyé quand l'utilisateur selectionne l'item d'un menu, quand un controle envois un message de notification a la fenetre auquel elle appartient, ou quand un raccourcis clavier est transmis.

Paramètres:

wNotifyCode

Poid fort de wParam. Specifies the notification code if the message is from a control. Vaut 1si le message vient d'un raccourcis clavier, vaut 0 s'il s'agit d'un item de menu.

wID

Poid faible de wParam. L'identifiant de l'item de menu, controle, ou raccourcis clavier.

hwndCtl

Value of lParam. Identifies the control sending the message if the message is from a control. Otherwise, this parameter is NULL.

Valeur retournée:

Si une application traite ce message elle doit retournée zéro.

Remarque:

Accelerator keystrokes that select items from the System menu are translated into WM_SYSCOMMAND messages.
If an accelerator keystroke occurs that corresponds to a menu item when the window that owns the menu is minimized, no WM_COMMAND message is sent. However, if an accelerator keystroke occurs that does not match any of the items in the window's menu or in the System menu, a WM_COMMAND message is sent, even if the window is minimized.
If an application enables a menu separator, the system sends a WM_COMMAND message with the low-word of the wParam parameter set to zero when the user selects the separator.

Exemple:

Voir aussi:

WM_SYSCOMMAND


WM_Size

WM_Size (equ h)*

fwSizeType = wParam; // resizing flag
nWidth = LOWORD(lParam); // width of client area
nHeight = HIWORD(lParam); // height of client area

Description:
Le message WM_SIZE est transmis a une fenêtre après que sa taille est changé.

Paramètres:

fwSizeType

Valeur de wParam. Précise le type de redimentionnement.
Ce Paramètre peut recevoir les valeurs suivantes:

SIZE_MAXHIDE Message is sent to all pop-up windows when some other window is maximized.
SIZE_MAXIMIZED Window has been maximized.
SIZE_MAXSHOW Message is sent to all pop-up windows when some other window has been restored to its former size.
SIZE_MINIMIZED Window has been minimized.
SIZE_RESTORED Window has been resized, but neither the SIZE_MINIMIZED nor SIZE_MAXIMIZED value applies.
nWidth

Poid faible de lParam. Nouvelle largeur de la fenêtre (zone client).

nHeight

Poid fort de lParam. Nouvelle hauteur de la fenêtre (zone client).

Valeur retournée:

Si une application traite ce message elle doit retournée zéro.

Remarque:

If the SetScrollPos or MoveWindow function is called for a child window as a result of the WM_SIZE message, the bRedraw parameter should be nonzero to cause the window to be repainted.
Although the width and height of a window are 32-bit values, the nWidth and nHeight parameters of the WM_SIZE message contain only the low-order 16 bits.

Exemple:
.elseif eax==WM_SIZE ;On intercepte le message
mov eax,lParam ;on met la valeur de lParam dans eax
movzx edx,ax ;Copie la valeur dans edx en étendant celle-ci à 0
shr eax,16 ; on décalle la valeur dans eax pour ne garder que la partie haute
On se retrouve avec le poid fort dans eax soit nHeight et on peut exploiter nWidth dans edx.
Par exemple en déclarant: LOCAL pt :POINT ;déclare pt de type Point
mov pt.x,edx ;width
mov pt.y,eax ;height
Pour redimentionner un objet sur la fenêtre il suffira ensuite d'appeler la fonction GetDlgItem puis MoveWindow.

Voir aussi:

MoveWindow, SetScrollPos


FpuIntro

FPU Introduction*

Introduction:
Faire des calculs mathématique avec le processeur n'est pas toujours simple car il ne travail que sur des nombre entier, c'est pourquoi les constructeurs ajoute un coprocesseur mathématique qui lui, est entièrement dédié a cette tâche. Le coprocesseur n'accède pas directement a la Ram, cela complique un petit peu notre affaire mais il est capable de faire très rapidement des calculs sur des nombres codés dans des registres de 80 bits. Les échanges avec le processeur permette de recevoir des valeurs de 64 bits maximum, les valeurs supérieur seront donc tronquées. Le coprocesseur utilise une pile pour stocker les valeurs, cette pile STx peut stocker 8 valeurs de ST0 à ST7.
Attention aux instructions de transfert les valeurs seront empilées ou dépilés selon l'instruction utilisée, il s'agit bien d'un pile.(push empile, pop dépile)
N'oubliez pas non plus d'initialiser avant de s'en servir avec l'instruction Finit.

Une astuce assez mignonne consiste a faire des macros dans un fichier et de l'inclure à votre projet pour s'en servir. Il y'a avec masm32 la fpulib qui contient des fonctions prêts à l'emploi.

Les registres du FPU

On l'a vue une pile de 8 registres de 80 bits pour stocker les nombres.
Mais le FPU c'est aussi 3 registres de 16 Bits.
Le registre de control
Le registre de Status
Le registre de Tag

Registre de Control

Registre de 16 Bits, Permettant de selectionner plusieurs mode de fonctionnement de la FPU.

15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
 |  |  | IC | RC |  | PC |  | IEM |  | PM | UM | OM | ZM | DM | IM

IM Invalid operation Mask
DM Denormalized operand Mask
ZM Zero divide Mask, masque de division par 0
OM Overflow Mask, masque de dépassement
UM Underflow Mask, masque d'underflow (probablement si on dépile trop, plus de pop que de push)
PM Precision Mask, masque de précision

The IEM field (bit 7) or Interrupt Enable Mask determines whether any of the interrupt masks will be enabled (bit = 0) or all those masks will be disabled (bit = 1). This bit field is set to 1 in the initialized state. (This field is also for compatibility with early co-processors and not used anymore.)

Bits 5-0 are the interrupt masks. In the initialized state, they are all set to 1 which lets the FPU handle all exceptions. When any one of them is set to 0, it instruct the FPU to generate an interrupt whenever that particular exception is detected so that the program will take whatever action may be deemed necessary before returning control to the FPU.

The IC field (bit 12) or Infinity Control allows for two types of infinity arithmetic:

0 = Both -infinity and +infinity are treated as unsigned infinity (initialized state)
1 = Respects both -infinity and +infinity

This field has been retained for compatibility with the 287 and earlier co-processors. In the more modern FPUs, this bit is disregarded and both -infinity and +infinity are respected.

The RC field (bits 11 and 10) or Rounding Control determines how the FPU will round results in one of four ways:

00 = Round to nearest, or to even if equidistant (this is the initialized
state)
01 = Round down (toward -infinity)
10 = Round up (toward +infinity)
11 = Truncate (toward 0)

The PC field (bits 9 and 8) or Precision Control determines to what precision the FPU rounds results after each arithmetic instruction in one of three ways:

00 = 24 bits (REAL4)
01 = Not used
10 = 53 bits (REAL8)
11 = 64 bits (REAL10) (this is the initialized state)

Les Bits 6 et 13 à 15 sont non utilisé ou reservé.(ndla: Mylène semble reservé aussi)

Les fonctions FSTCW (fpu store control word) et FLDCW (fpu load control word) permettent respectivement de sauver et de charger le registre de control.

Registre de Statut

Registre de 16 bits indiquant l'état dans laquel se situe la FPU.Ce registre peut-être modifié après chaque instruction son acces complète ne se fait quand lecture.
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
B | C3 | TOP |  |  | C2 | C1 | C0 | IR | SF | P | U | O | Z | D | I

A l'initialisation de la FPU tous les bits sont mis à 0.

Le bit 15 BUSY (B) indique que la FPU est occupé.

The C3 (bit 14) and C2 - C0 (bits 10-8) fields contain the condition codes following the execution of some instructions such as comparisons. These codes will be explained in detail for each instruction affecting those fields.

The TOP field (bits 13-11) is where the FPU keeps track of which of its 80-bit registers is at the TOP. The BC numbers described previously for the FPU's internal numbering system of the 80-bit registers would be displayed in that field. When the programmer specifies one of the FPU 80-bit registers ST(x) in an instruction, the FPU adds (modulo 8) the ST number supplied to the value in this TOP field to determine in which of its registers the required data is located.

The IR field (bit 7) or Interrupt Request gets set to 1 by the FPU while an exception is being handled and gets reset to 0 when the exception handling is completed. When the interrupt is masked in the Control Word for the FPU to handle the exception, this bit may never be seen to be set while stepping through the instructions with a debugger. However, if the programmer handles the interrupt, that bit should remain set until the interrupt handling routine is completed.

Bits 6-0 are flags raised by the FPU whenever it detects an exception. Those exception flags are cumulative in the sense that, once set (bit=1), they are not reset (bit=0) by the result of a subsequent instruction which, by itself, would not have raised that flag. Those flags can only be reset by either initializing the FPU (FINIT instruction) or by explicitly clearing those flags (FCLEX instruction).

The SF field (bit6) or Stack Fault exception is set whenever an attempt is made to either load a value into a register which is not free (the C1 bit would also get set to 1) or pop a value from a register which is free (and the C1 bit would get reset to 0). (Such stack fault is also treated as an invalid operation and the I field flag bit0 would thus also be set by this exception; see below.)

The P field (bit5) or Precision exception is set whenever some precision is lost by instructions which do exact arithmetic. For example, dividing 1 by 10 does not yield an exact value in binary arithmetic and would set the P exception flag. Another example which sets the P exception flag would be the conversion of a REAL10 to a REAL4 when some of the least significant bits would be lost.
If the FPU handles this exception (when the PM bit is set in the Control Word), it rounds the result according to the rounding mode specified in the RC field of the Control Word.

The U field (bit4) or Underflow exception flag gets set whenever a value is too small (without being equal to 0) to be represented properly. Each of the floating point formats has a different limit on the smallest number which can be represented. The U flag gets set if the result of an operation exceeds that limit. For example, dividing a valid very small number by a large number could exceed the limit. A valid REAL10 small number may be much smaller than acceptable for the REAL4 or REAL8 formats; in such cases, conversion from the former to the latter would also set the U flag.
If the FPU handles this exception (when the UM bit is set in the Control Word), it would denormalize the value until the exponent is in range or ultimately return a 0.

The O field (bit3) or Overflow exception flag gets set whenever a value is too large in magnitude to be represented properly. Again, each of the floating point formats has a different limit on the largest number which can be represented. The O flag gets set if the result of an operation exceeds that limit. For example, multiplying a valid very large number by another large number could exceed the limit. A valid REAL10 large number may be much larger than acceptable for the REAL4 or REAL8 formats; conversion from the former to the latter would also set the O flag.
If the FPU handles this exception (when the OM bit is set in the Control Word), it would generate a properly signed INFINITY according to the IC flag of the Control Word.

The Z field (bit2) or Zero divide exception flag gets set whenever the division of a finite non-zero value by 0 is attempted.
If the FPU handles this exception (when the ZM bit is set in the Control Word), it would generate a properly signed INFINITY according to the XOR of the operand signs and then according to the IC flag of the Control Word.

The D field (bit1) or Denormalized exception flag gets set whenever an instruction attempts to operate on a denormalized number or the result of the operation is a denormalized number.
If the FPU handles this exception (when the DM bit is set in the Control Word), it would simply continue with normal processing and then check for other possible exceptions.

Le bit 0 Invalid (I) est positionné quand la FPU considère l'opération non valide.

Cela peut se produire par exemple si:
- On empile plus+ que la pile ne peut recevoir (overflow) ou si l'on dépile (pop) plus que possible.
- Si l'on divise 0 par 0, ou si l'on soustrait l'infini à l'infini.

Si la FPU rencontre cette exception alors que le masque IM du registre de control est mis à 1, la fonction retournera un NAN si l'un est utilisé comme opérande sinon elle retournera un "INDEFINITE" NAN.*

Voir l'instruction FSTSW FPU store status word.

Registre de TAG (Marqueurs)

15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
Tag7 |  | Tag6 |  | Tag5 |  | Tag4 |  | Tag3 |  | Tag2 |  | Tag1 |  | Tag0

Un tag est un groupe de 2 bits. Par exemple le bit 0 et le bit 1 forme à eux deux le Tag0 correspondant au registre ST0.Chaque tag peut donc avoir 4 valeurs.

00 | Le registre contient une valeur valide non équivalente à zéro.
01 | Le registre contient la valeur de 0.
10 | Le registre contient une valeur spécifique, infinie par exemple.
11 | Le registre est vide.

(Partiellement traduit et adapté du tutoriel sur la fpulib)

Auteurs et sources: BruNews / Babasse celon les infos traduitent de Raymond Filiatreault
Contact: bnutiles3@free.fr

SOURCES UTILES SUR LE FPU

http://www.asmfr.com/code.aspx?ID=20825
Tres bonne exemple de programmation avec le fpu


FpuAlpha

FPU Instructions par ordre alphabétique

F2XM1 2 to the X power minus 1
FABS Valeur absolue de ST(0)
FADD Additionne 2 valeurs.
FADDP Additionne 2 valeurs et fait un pop ST(0)
FBLD Charge un BCD depuis la mémoire
FBSTP Sauve un BCD dans la mémoire
FCHS Change le signe de ST(0)
FCLEX Efface les exceptions
FCMOVcc Déplacement conditionné par les flags du CPU
FCOM Compare ST(0) à une autre valeur
FCOMI Compare ST(0) à ST(i) et modifie les flags du CPU
FCOMIP Compare ST(0) à ST(i) modifie les flags du CPU flags et fait un pop ST(0)
FCOMP Compare ST(0) à une valeur et fait un pop ST(0)
FCOMPP Compare ST(0) à ST(1) et fait un pop sur les 2 registres
FCOS Cosinus de la valeur ST(0)
FDECSTP Decremente le compteur de pile
FDIV Divise 2 valeurs
FDIVP Divise 2 Valeur et fait un pop ST(0)
FDIVR Divise à l'envers 2 valeurs
FDIVRP Divise à l'envers 2 valeurs et fait un pop ST(0)
FFREE Libère un registre de donnée
FIADD Ajoute un entier en mémoire à ST(0)
FICOM Compare ST(0) à une valeur entière
FICOMP Compare ST(0) à une valeur entière et fait un pop ST(0)
FIDIV Divise ST(0) par un entier en mémoire
FIDIVR Divise un entier en mémoire par ST(0)
FILD Charge un entier depuis la mémoire
FIMUL Multiplie ST(0) par un entier en mémoire
FINCSTP Incremente le pointeur de pile
FINIT Initialise la FPU
FIST Sauve un entier dans la mémoire
FISTP Sauve un entier dans la mémoire et fait un pop ST(0)
FISUB Soustrait un entier en mémoire à ST(0)
FISUBR Soustrait ST(0) à un entier en mémoire
FLD Charge un nombre (réel)
FLD1 Charge la valeur de 1
FLDCW Charge un word dans le registre de control
FLDENV LoaD environment*
FLDL2E Load the log base 2 of e (Napierian constant)*
FLDL2T Load the log base 2 of Ten*
FLDLG2 Load the log base 10 of 2 (common log of 2)*
FLDLN2 Load the log base e of 2 (natural log of 2)*
FLDPI Charge la valeur de PI
FLDZ Charge la valeur de Zero
FMUL Multiplie deux valeurs
FMULP Multiplie deux valeurset fait un pop ST(0)
FNCLEX Efface les exceptions (no wait)
FNINIT Initialise la FPU (no wait)
FNOP Ne fait rien, l'équivalent d'un nop mais pour la fpu
FNSAVE Sauve le registre d'état du FPU (no wait)
FNSTCW Sauve le registre de control (no wait)
FNSTENV Store environment (no wait)*
FNSTSW Store status word (no wait)
FPATAN Partial arctangent of the ratio ST(1)/ST(0)
FPREM Partial remainder
FPREM1 Partial remainder 1
FPTAN Partial tangent of the angle value in ST(0)
FRNDINT arrondis ST(0) dans un entier(integer)
FRSTOR Restore all registers
FSAVE Save state of FPU
FSCALE Scale ST(0) by ST(1)
FSIN Sine of the angle value in ST(0)
FSINCOS Sine and cosine of the angle value in ST(0)
FSQRT Square root of ST(0)
FST Store real number
FSTCW Store control word
FSTENV Store environment
FSTP Store real number and pop ST(0)
FSTSW Store status word
FSUB Subtract two floating point values
FSUBP Subtract two floating point values and pop ST(0)
FSUBR Subtract in reverse two floating point values
FSUBRP Subtract in reverse two floating point values and Pop ST(0)
FTST Test ST(0) par comparaison à +0.0
FUCOM Unordered Compare ST(0) to a floating point value
FUCOMI Unordered Compare ST(0) to ST(i) and set CPU flags
FUCOMIP Unordered Compare ST(0) to ST(i) and set CPU flags and pop ST(0)
FUCOMP Unordered Compare ST(0) to a floating point value and pop ST(0)
FUCOMPP Unordered Compare ST(0) to ST(1) and pop both registers
FWAIT Attends tant que la FPU est occupé
FXAM Examine the content of ST(0)
FXCH Exchange the top data register with another data register
FXTRACT Extract exponent and significand
FYL2X Y*Log2X
FYL2XP1 Y*Log2(X+1)


FADD

FADD m32 ST(0) += m32
FADD m64 ST(0) += m64
FADD ST(0), ST(i) ST(0) += ST(i)
FADD ST(i), ST(0) ST(i) += ST(0)


FADDP

FADDP ST(i), ST(0) ; ST(i) += ST(0) ; pop stack
FADDP ; ST(1) += ST(0) ; pop stack


Fiadd

FIADD src

FIADD m32int ST(0) += m32int
FIADD m16int ST(0) += m16int


FDIV

Instruction
        Description
FDIV m32real        ST(0) /= m32real
FDIV m64real        ST(0) /= m64real
FDIV ST(0), ST(i)   ST(0) /= ST(i)
FDIV ST(i), ST(0)   ST(i) /= ST(0)


FDIVP

FDIVP ST(i), ST(0) ST(i) /= ST(0) et pop stack
FDIVP ST(1) /= ST(0) et pop stack


FDIVR

Instruction
        Description
FDIVR m32real       ST(0) = m32real / ST(0)
FDIVR m64real       ST(0) = m64real / ST(0)
FDIVR ST(0), ST(i)  ST(0) = ST(i) / ST(0)
FDIVR ST(i), ST(0)  ST(i) = ST(0) / ST(i)


FDIVRP

FDIVRP ST(i), ST(0) ST(i) = ST(0) / ST(i)
FDIVRP ST(1) = ST(0) / ST(1)

pop stack ensuite


FIDIV

FIDIV src

FIDIV m32int ST(0) /= m32int
FIDIV m16int ST(0) /= m16int


FIDIVR

FIDIVR src

FIDIVR m32int ST(0) = m32int / ST(0)
FIDIVR m16int ST(0) = m16int / ST(0)


FABS

ST(0) = ABS(ST(0));


FCHS

Change le signe de ST(0)


FCOM

FCOM m32real     cmp ST(0) et m32real
FCOM m64real     cmp ST(0) et m64real
FCOM ST(i)       cmp ST(0) et ST(i)
FCOM             cmp
ST(0) et ST(1)

Le signe du zéro est ignoré.

Condition       C3   C2   C0
ST(0) > SRC      0    0    0
ST(0) < SRC      0    0    1
ST(0) = SRC      1    0    0

Unordered 1 1 1


FCOMP

FCOMP m32real cmp ST(0) et m32real

FCOMP m64real cmp ST(0) et m64real

FCOMP ST(i) cmp ST(0) et ST(i)

FCOMP cmp ST(0) et ST(1)

Remonte la pile après la comparaison.

Le signe du zéro est ignoré.

Condition       C3   C2   C0

ST(0) > SRC 0 0 0

ST(0) < SRC 0 0 1

ST(0) = SRC 1 0 0

Unordered 1 1 1


FCOMPP

Compare ST(0) et ST(1)

Remonte la pile 2 FOIS après la comparaison.

Le signe du zéro est ignoré.

Condition       C3   C2   C0

ST(0) > SRC 0 0 0

ST(0) < SRC 0 0 1

ST(0) = SRC 1 0 0

Unordered 1 1 1


FINIT

Initialise FPU après attente de fin d'opération en cours.

FPUControlWord = 037FH

FPUStatusWord = 0

FPUTagWord = FFFFh

FPUDataPointer = 0

FPUInstructionPointer = 0

FPULastInstructionOpcode = 0

C0 = C1 = C2 = C3 = 0


FBLD

FBLD mem

Charge le BCD à l'adresse spécifiée, le convertit en réel et le pousse sur stack.

ST(0) indéfini si BCD invalide.


FBSTP

FBSTP mem

Convertit ST(0) en BCD à l'adresse spécifiée et POP stack.


FILD

FILD src

FILD m16int

FILD m32int

FILD m64int

Convertit src en réel et pousse sur stack


FIST

FIST dest

FIST m16int m16int = (int16) ST(0)

FIST m32int m32int = (int32) ST(0)


FISTP

FISTP dest

FISTP m16int m16int = (int16) ST(0)

FISTP m32int m32int = (int32) ST(0)

FISTP m64int m64int = (int64) ST(0)

pop stack ensuite


FLD

FLD (Charge un nombre réel)
Syntaxe: fld Src
Exception flags: Stack Fault, Invalid operation, Denormalized value

"Pousse" src sur la pile

FLD m32real
FLD m64real
FLD m80real
FLD ST(i)

Le texte en anglais du tuto en cours de modif et traduction:
This instruction decrements the TOP register pointer in the Status Word and loads the floating point value from the specified source (Src) in the new TOP data register. The source can be one of the FPU's data registers or the memory address of a REAL4, REAL8, or REAL10 value (see Chap.2 for addressing modes of real numbers).

If the ST(7) data register which would become the new ST(0) is not empty, both a Stack Fault and an Invalid operation exceptions are detected, setting both flags in the Status Word. The TOP register pointer in the Status Word would still be decremented and the new value in ST(0) would be the INDEFINITE NAN.

If the source is a denormalized number, a Denormal exception will be detected, setting the related flag in the Status Word. The value will still be loaded and normalized if possible.

If the source is one of the FPU's data registers, its value is retrieved before the TOP register pointer is decremented. If that source register is empty, both a Stack Fault and an Invalid operation exceptions are detected, setting both flags in the Status Word. The TOP register pointer will still be decremented and the new value in ST(0) will be the INDEFINITE NAN.

The content of the Tag Word will be modified according to the result of the operation.

Exemples d'utilisation de cette instruction:

fld  st(3) ;La valeur de ST(3) est copié dans le nouveau ST(0)
           ;La valeur est maintenant la même dans ST(0) et ST(4)
       ;Ne perdez pas de vue qu'il s'agit d'une pile!
fld  st    ;duplicates the TOP value which will now be in both ST(0) and ST(1)

Note that fld st(7) will always be an Invalid operation and the outcome will always be the INDEFINITE value in the new ST(0). The ST(7) register must be empty for a valid FLD instruction but would also be an invalid source if it is empty!
fld  real4_var   ;La valeur d'un real4_var variable
                 ;est convertie au REAL10 format et copié dans ST(0)

fld  qword ptr[ebx] ;ST(0) prend la valeur du QWORD situé à l'adresse
                 ;indiqué par EBX et que le FPU considère comme une
         ;valeur de type REAL8.

fld  tbyte ptr[edi+50] ;the FPU interprets the value at the address EDI+50
                 ;as a REAL10 and copies it to ST(0).
The content of memory is simply a series of bits. Floating point data cannot be differentiated from any other type of data. The FPU will thus interpret a series of bits as instructed. (See Rule #3).

If the source is a REAL10 value in memory, it has the same format as the FPU's data registers and is simply copied as is.

However, if the source is a REAL4 or a REAL8 value, it is converted to the 80-bit REAL10 format before loading it to ST(0). When such an operation is observed with a debugger, the displayed value in the FPU data register may often seem slightly different from the intended one. That would be due to the rounding which occurred when the data had to be shortened to fit into the REAL4 or REAL8 format, and some precision was lost.

Just as 3.33333... is never the exact value of 10÷3 regardless of the length of the fractional part, binary fractions behave in a similar manner. For example, a decimal value of 1.2 in binary would be:

1.00110011001100110011001100110011....b    0011 repeating indefinitely.
If a variable is declared as a REAL4 and initialized with that value, the assembler would most probably have used the FPU to convert it to binary with 64 bits of precision using the "0011" sequence as often as possible. To fit that value into the REAL4 format, it could only keep the first 23 fraction bits. The 24th bit being a "1", the number was rounded UP to:
1.0011 0011 0011 0011 0011 010b
Because of this rounding UP, this value is now slightly larger than the original decimal value and a debugger would show it as follows if loaded into an FPU data register:
1.2000000476837158
Similarly, some binary fractions would be rounded DOWN and the resulting value would be slightly smaller than the original one. For example, a REAL4 variable initialized with a decimal value of 1.3 would be loaded to the FPU's data register as:
1.0100 1100 1100 1100 1100 110b
which would be shown in decimal format by a debugger as:
1.2999999523162842
This rounding can also affect REAL4 variables initialized with large numbers having more than 7 integer digits. For example, if a REAL4 variable is initialized with 987654321.0 and loaded to the FPU, a debugger would show it as 987654336.0!
The FPU and floating point real numbers do not provide unlimited precision. The REAL4 format's relative precision is only equivalent to approx. 7 significant decimal digits, the REAL8 format being equivalent to approx. 15 significant decimal digits, and the REAL10 to 19 significant decimal digits.


FST

FST dest

FST m32real m32real = ST(0)

FST m64real m64real = ST(0)

FST ST(i) ST(i) = ST(0)


FSTP

FSTP m32real m32real = ST(0)

FSTP m64real m64real = ST(0)

FSTP m80real m80real = ST(0)

FSTP ST(i) ST(i) = ST(0)

pop stack ensuite


FXCH

FXCH ST(i) échange ST(0) et ST(i)

FXCH échange ST(0) et ST(1)


Lexique*

  • Adresse, emplacement dans la mémoire par convention on la note en hexadécimal, mais souvent on s'en occupe pas puisque le code est "relogé" et l'on travail avec des étiquettes jmp loop ou loop represente l'adresse ou l'on va sauter par exemple.
  • Assemblage, action de transformer un code source en un fichier binaire éxecutable.
  • BIOS (Basic interface Input Output Software) Logiciel en Rom (flashram maintenant) Chargé d'interfacer le processeur et les différents périfériques.(clavier, souris, ddure etc.)
  • Bit, plus petite valeur informatique composé uniquement de 1 ou 0.
  • Buffer, section de mémoire reservé. Par exemple à l'ouverture d'un fichier on demande sa taille, on reserve dans la mémoire un espace de cette taille (buffer) pour charger le dis fichier.
  • Byte, groupe de 8 bits autrement appelé Octet
  • Compilateur, programme traduisant un code source (fichier texte) en un fichier binaire executable, exe, com, dll
  • Dll, (dynamic link librairie), fichier binaire contenant des fonctions (code executable) pouvant être appelé par un autre executable. voir win32api
  • GDI+, extention de la librairie GDI, avec par exemple l'alpha, la manipulation de fichier jpeg, tiff, png etc.. , sur le site de radasm il existe les .inc et .lib et un exemple pour utiliser cette librairie.
  • Handle, identifiant unique attribué par l'os pour chaque objet (fenêtre, contrôle, etc...) à leur création.
  • MBR (Master Boot Record) Secteur de boot d'un support (disquette,disque-dur...), le premier secteur du support.
  • Pile, Forme de stockage des données qui fait penser à une pile d'assiettes par exemple.
  • .rap, fichier projet de radasm.
  • .wap, fichier projet de winasm.


APITHEME

API Fonctions et messages classées par thèmes

  • Les fenêtres (window)
  • Le curseur (caret)
  • Le presse papier (clipboard)
  • Les boites de dialogues standards
  • Le pointeur (cursor)
  • Les menus
  • Les ancres (hook)
  • Les icônes (icons)
  • Les raccourcis clavier
  • L'entrée clavier (input keyboard)
  • MDI Interface multi-documents
  • Les messages
  • La souris
  • Les Boites de dialogues
  • Les classes
  • Le dessin et le redessin
  • Les rectangles
  • Les intervalles de temps (timer)
  • Les propriétées
  • Les procédures
  • Controle commun (common control)
  • Les listes d'images
  • Les images de bits (bitmap)

Le s fenêtres

Fonctions | Messages
AdjustWindowRect AdjustWindowRectEx AnyPopup BeginDeferWindowPos BringWindowToTop ChildWindowFromPoint CloseWindow CreateWindow CreateWindowEx DeferWindowPos DestroyWindow EnableWindow EndDeferWindowPos EnumChildProc EnumChildWindows EnumThreadWindows EnumThreadWndProc EnumWindows EnumWindowsProc FindWindow GetClientRect GetDesktopWindow GetForegroundWindow GetLastActivePopup GetNextWindow GetParent GetTopWindow GetWindow GetWindowPlacement GetWindowRect GetWindowText GetWindowTextLength GetWindowThreadProcessId IsChild IsWindow IsWindowUnicode IsWindowVisible IsZoomed MoveWindow SetForegroundWindow SetParent SetWindowLong SetWindowPlacement SetWindowPos SetWindowText ShowOwnedPopups ShowWindow WindowFromPoint WinMain Fonctions dépassées voir supprimées: EnumTaskWindows GetSysModalWindow GetWindowTask SetSysModalWindow | WM_ACTIVATE WM_ACTIVATEAPP WM_CANCELMODE WM_CHILDACTIVATE WM_CLOSE WM_COPYDATA WM_CREATE WM_DESTROY WM_ENABLE WM_ENDSESSION WM_GETMINMAXINFO WM_GETTEXT WM_MOVE WM_NCACTIVATE WM_NCCALCSIZE WM_NCCREATE WM_NCDESTROY WM_PARENTNOTIFY WM_POWER WM_QUERYENDSESSION WM_QUERYOPEN WM_QUIT WM_SETTEXT WM_SHOWWINDOW WM_SIZE WM_WINDOWPOSCHANGED WM_WINDOWPOSCHANGING

Le curseur (caret, il n'existe qu'un curseur à la fois)

Fonctions | Messages
CreateCaret DestroyCaret GetCaretBlinkTime GetCaretPos HideCaret SetCaretBlinkTime SetCaretPos ShowCaret |

Le presse papier (Clipboard)

Fonctions | Messages
ChangeClipboardChain CloseClipboard CountClipboardFormats EmptyClipboard EnumClipboardFormats GetClipboardData GetClipboardFormatName GetClipboardOwner GetClipboardViewer GetOpenClipboardWindow GetPriorityClipboardFormat IsClipboardFormatAvailable OpenClipboard RegisterClipboardFormat SetClipboardData SetClipboardViewer | WM_ASKCBFORMATNAME WM_CHANGECBCHAIN WM_COPY WM_CUT WM_DESTROYCLIPBOARD WM_DRAWCLIPBOARD WM_HSCROLLCLIPBOARD WM_PAINTCLIPBOARD WM_PASTEWM_RENDERALLFORMATS WM_RENDERFORMAT WM_SIZECLIPBOARD WM_VSCROLLCLIPBOARD

Boites de dialogues standard (Common dialog boxes)

Fonctions | Messages
ChooseColor ChooseFont CommDlgExtendedError FindText GetFileTitle GetOpenFileName GetSaveFileName PageSetup DlgPrint DlgReplaceText STRUCTURES: OFNOTIFY PAGESETUPDLG | CDM_GETFILEPATH CDM_GETFOLDERIDLIST CDM_GETFOLDERPATH CDM_GETSPEC CDM_HIDECONTROL CDM_SETCONTROLTEXT CDM_SETDEFEXT CDN_FILEOK CDN_FOLDERCHANGE CDN_HELP CDN_INITDONE CDN_SELCHANGE CDN_SHAREVIOLATION CDN_TYPECHANGE COLOROKSTRING FILEOKSTRING FINDMSGSTRING LBSELCHSTRING SETRGBSTRING SHAREVISTRING WM_CHOOSEFONT_SETFLAGS WM_CHOOSEFONT_SETLOGFONT WM_PSD_ENVSTAMPRECT WM_PSD_FULLPAGERECT WM_PSD_GREEKTEXTRECT WM_PSD_MARGINRECT WM_PSD_MINMARGINRECT WM_PSD_PAGESETUPDLG WM_PSD_YAFULLPAGERECT

Le pointeur (cursor)

Fonctions | Messages
ClipCursor CopyCursor CreateCursor DestroyCursor GetClipCursor GetCursor GetCursorPos LoadCursor LoadCursorFromFile SetCursor SetCursorPos SetSystemCursor ShowCursor | WM_SETCURSOR

Les menus

Fonctions | Messages
AppendMenu CheckMenuItem CheckMenuRadioItem CreateMenu CreatePopupMenu DeleteMenu DestroyMenu DrawMenuBar EnableMenuItem GetMenu GetMenuCheckMarkDimensions GetMenuDefaultItem GetMenuItemCount GetMenuItemID GetMenuItemInfo GetMenuItemRect GetMenuState GetMenuString GetSubMenu GetSystemMenu HiliteMenuItem InsertMenu InsertMenuItem IsMenu LoadMenu LoadMenuIndirect MenuItemFromPoint ModifyMenu RemoveMenu SetMenu SetMenuDefaultItem SetMenuItemBitmaps SetMenuItemInfo TrackPopupMenu TrackPopupMenuEx Fonction obsolète: ChangeMenu | WM_CONTEXTMENU WM_DRAWITEM WM_ENTERMENULOOP WM_EXITMENULOOP WM_INITMENU WM_INITMENUPOPUP WM_MEASUREITEM WM_MENUCHAR WM_MENUSELECT WM_SYSCOMMAND

Les ancres (hook)

Fonctions | Messages
CallMsgFilter CallNextHookEx CallWndProc CBTProc DebugProc GetMsgProc JournalPlaybackProc JournalRecordProc KeyboardProc MessageProc MouseProc SetWindowsHookEx ShellProc SysMsgProc UnhookWindowsHookEx Fonctions dépassées: DefHookProc SetWindowsHook UnhookWindowsHook | WM_QUEUESYNC

Les icônes (icons)

Fonctions | Messages
ArrangeIconicWindows CopyIcon CreateIcon CreateIconFromResource CreateIconIndirect DestroyIcon DrawIcon DrawIconEx GetIconInfo IsIconic LoadIcon LookupIconIdFromDirectory OpenIcon | WM_ERASEBKGND WM_ICONERASEBKGND WM_PAINTICON

Les raccourcis clavier

Fonctions | Messages
CopyAcceleratorTable CreateAcceleratorTable DestroyAcceleratorTable LoadAccelerators TranslateAccelerator | WM_COMMAND WM_INITMENU WM_INITMENUPOPUP WM_MENUCHAR WM_MENUSELECT WM_SYSCHAR WM_SYSCOMMAND

Le clavier (input keyboard)

Fonctions | Messages
ActivateKeyboardLayout EnableWindow GetActiveWindow GetAsyncKeyState GetFocus GetKeyboardLayoutName GetKeyboardState GetKeyNameText GetKeyState IsWindowEnabled keybd_event LoadKeyboardLayout MapVirtualKey OemKeyScan RegisterHotKey SetActiveWindow SetFocus SetKeyboardState ToAscii ToUnicode UnloadKeyboardLayout UnregisterHotKey VkKeyScan Fonctions obsolète: GetKBCodePage | WM_ACTIVATE WM_CHAR WM_DEADCHAR WM_HOTKEY WM_KEYDOWN WM_KEYUP WM_KILLFOCUS WM_SETFOCUS WM_SYSCHAR WM_SYSDEADCHAR WM_SYSKEYDOWN WM_SYSKEYUP

MDI, Fenêtre multi-documents.

Fonctions | Messages
CreateMDIWindow DefFrameProc DefMDIChildProc TranslateMDISysAccel | WM_MDIACTIVATE WM_MDICASCADE WM_MDICREATE WM_MDIDESTROY WM_MDIGETACTIVE WM_MDIICONARRANGE WM_MDIMAXIMIZE WM_MDINEXT WM_MDIREFRESHMENU WM_MDIRESTORE WM_MDISETMENU WM_MDITILE

Les messages

Fonctions | Messages
BroadcastSystemMessage DefWindowProc DispatchMessage GetInputState GetMessage GetMessageExtraInfo GetMessagePos GetMessageTime GetQueueStatus InSendMessage PeekMessage PostAppMessage PostMessage PostQuitMessage PostThreadMessage RegisterWindowMessage ReplyMessage SendAsyncProc SendMessage SendMessageCallback SendMessageTimeout SendNotifyMessage SetMessageExtraInfo TranslateMessage WaitMessage Fonctions obsolètes: SetMessageQueue |

La souris

Fonctions | Messages
DragDetect GetCapture GetDoubleClickTime mouse_event ReleaseCapture SetCapture SetDoubleClickTime SwapMouseButton | WM_CAPTURECHANGED WM_LBUTTONDBLCLK WM_LBUTTONDOWN WM_LBUTTONUP WM_MBUTTONDBLCLK WM_MBUTTONDOWN WM_MBUTTONUP WM_MOUSEACTIVATE WM_MOUSEMOVE WM_NCHITTEST WM_NCLBUTTONDBLCLK WM_NCLBUTTONDOWN WM_NCLBUTTONUP WM_NCMBUTTONDBLCLK WM_NCMBUTTONDOWN WM_NCMBUTTONUP WM_NCMOUSEMOVE WM_NCRBUTTONDBLCLK WM_NCRBUTTONDOWN WM_NCRBUTTONUP WM_RBUTTONDBLCLK WM_RBUTTONDOWN WM_RBUTTONUP

Le dessin et redessin

Fonctions | Messages
BeginPaint DrawAnimatedRects DrawCaption DrawEdge DrawFocusRect DrawFrameControl DrawState DrawStateProc DrawTextEx EndPaint ExcludeUpdateRgn GdiFlush GdiGetBatchLimit GdiSetBatchLimit GetBkColor GetBkMode GetBoundsRect GetROP2 GetUpdateRect GetUpdateRgn GetWindowDC GrayString InvalidateRect InvalidateRgn LockWindowUpdate OutputProc PaintDesktop RedrawWindow ResetDisplay SetBkColor SetBkMode SetBoundsRect SetRectRgn SetROP2 UpdateWindow ValidateRect ValidateRgn WindowFromDC | WM_DISPLAYCHANGE WM_ERASEBKGND WM_ICONERASEBKGND WM_NCPAINT WM_PAINT WM_PAINTICON WM_PRINT WM_PRINTCLIENT WM_SETREDRAW

Les rectangles

Fonctions | Messages
CopyRect EqualRect InflateRect IntersectRect IsRectEmpty OffsetRect PtInRect SetRect SetRectEmpty SubtractRect UnionRect |

Les timers (interval de temps)

Fonctions | Messages
KillTimer SetTimer TimerProc |

Les classes

Fonctions Messages
GetClassInfo
GetClassInfoEx
GetClassLong
GetClassName
GetClassWord
GetWindowLong
GetWindowWord
RegisterClass
RegisterClassEx
SetClassLong
SetClassWord
SetWindowLong
SetWindowWord
UnregisterClass

Les procedures

Fonctions Messages
CallWindowProc
DefWindowProc
WindowProc

Les propriétées

Fonctions Messages
EnumProps
EnumPropsEx
GetProp
PropEnumProc
PropEnumProcEx
RemoveProp
SetProp

Les controles communs (common control)

Fonctions | Messages
GetEffectiveClientRect InitCommonControls ShowHideMenuCtl | WM_NOTIFY : NM_CLICK NM_DBLCLK NM_KILLFOCUS NM_OUTOFMEMORY NM_RCLICK NM_RDBLCLK NM_RETURN NM_SETFOCUS

Les listes d'images

Fonctions Messages
ImageList_Add
ImageList_AddMasked
ImageList_BeginDrag
ImageList_Create
ImageList_Destroy
ImageList_DragEnter
ImageList_DragLeave
ImageList_DragMove
ImageList_DragShowNolock
ImageList_Draw
ImageList_DrawEx
ImageList_EndDrag
ImageList_ExtractIcon
ImageList_GetBkColor
ImageList_GetDragImage
ImageList_GetIcon
ImageList_GetIconSize
ImageList_GetImageCount
ImageList_GetImageInfo
ImageList_LoadBitmap
ImageList_LoadImage
ImageList_Merge
ImageList_Read
ImageList_Remove
ImageList_Replace
ImageList_ReplaceIcon
ImageList_SetBkColor
ImageList_SetDragCursorImage
ImageList_SetIconSize
ImageList_SetOverlayImage
ImageList_Write

Les boites de dialogues

Fonctions | Messages
CreateDialog CreateDialogIndirect CreateDialogIndirectParam CreateDialogParam DefDlgProc DialogBox DialogBoxIndirect DialogBoxIndirectParam DialogBoxParam DialogProc EndDialog GetDialogBaseUnits GetDlgCtrlID GetDlgItem GetDlgItemInt GetDlgItemText GetNextDlgGroupItem GetNextDlgTabItem IsDialogMessage MapDialogRect MessageBox MessageBoxEx SendDlgItemMessage SetDlgItemInt SetDlgItemText MessageBoxIndirect | WM_CTLCOLORMSGBOX WM_ENTERIDLE WM_GETDLGCODE WM_INITDIALOG WM_NEXTDLGCTL
 | Structures
 | DLGITEMTEMPLATE DLGTEMPLATE MSGBOXPARAMS

Les images de bits (bitmap)

Fonctions Messages
BitBlt
CreateBitmap
CreateBitmapIndirect
CreateCompatibleBitmap
CreateDIBitmap
CreateDIBSection
CreateDiscardableBitmap
ExtFloodFill
FloodFill
GetBitmapBits
GetBitmapDimensionEx
GetDIBColorTable
GetDIBits
GetPixel
GetStretchBltMode
LoadBitmap
MaskBlt
PatBlt
PlgBlt
SetBitmapBits
SetBitmapDimensionEx
SetDIBColorTable
SetDIBits
SetDIBitsToDevice
SetPixel
SetPixelV
SetStretchBltMode
StretchBlt
StretchDIBits

Fonctions obsolètes:

GetBitmapDimension
SetBitmapDimension


BoitesStandards

Les Boites de dialogues standards*


ExitThread

The ExitThread function ends a thread.

VOID ExitThread(

DWORD dwExitCode // exit code for this thread
);
Parameters

dwExitCode

Specifies the exit code for the calling thread. Use the GetExitCodeThread function to retrieve a thread's exit code.

Return Value

This function does not return a value.

Remarks

ExitThread is the preferred method of exiting a thread. When this function is called (either explicitly or by returning from a thread procedure), the current thread's stack is deallocated and the thread terminates. The entry-point function of all attached dynamic-link libraries (DLLs) is invoked with a value indicating that the thread is detaching from the DLL.
If the thread is the last thread in the process when this function is called, the thread's process is also terminated.

The state of the thread object becomes signaled, releasing any other threads that had been waiting for the thread to terminate. The thread's termination status changes from STILL_ACTIVE to the value of the dwExitCode parameter.
Terminating a thread does not necessarily remove the thread object from the operating system. A thread object is deleted when the last handle to the thread is closed.
The ExitProcess, ExitThread, CreateThread, CreateRemoteThread functions, and a process that is starting (as the result of a CreateProcess call) are serialized between each other within a process. Only one of these events can happen in an address space at a time. This means the following restrictions hold:

· During process startup and DLL initialization routines, new threads can be created, but they do not begin execution until DLL initialization is done for the process.
· Only one thread in a process can be in a DLL initialization or detach routine at a time.
· ExitProcess does not return until no threads are in their DLL initialization or detach routines.

A thread that uses functions from the C run-time libraries should use the _beginthread and _endthread C run-time functions for thread management rather than CreateThread and ExitThread. Failure to do so results in small memory leaks when ExitThread is called.

See Also

CreateProcess, CreateRemoteThread, CreateThread, ExitProcess, FreeLibraryAndExitThread, GetExitCodeThread, TerminateThread


Gdi32

Gdi32.dll*

Cette librairie s'occupe des fonctions graphiques de windows.
Quelques fonctions inclusent dans la librairie Gdi32

AbortDoc (stop l'impression en cours)
BitBlt (Copie d'image)
TextOut (Sortie texte d'une chaine de caractère)


Kernel32

Kernel32.dll*

Cette librairie est en quelque sorte la librairie "system", elle est intiment lié à votre machine.Quelques fonctions inclusent dans la librairie Kernel32, livrées avec une mini explication se qui peut s'avérer pratique pour trouver rapidement la bonne fonction.

CloseHandle (fermeture d'handle)
CreateFile (Ouvrir/créer/Tronquer un fichier...)
ExitProcess (Termine un processus ouvert)
GetExitCode
GetLastError (Obtenir le code d'erreur)
GetModuleHandle (obtenir le handle d'une application ouverte)
 GetOpenFilename (Ouvre la boite de dialogue ouvrir standard, selecteur de fichiers)
GlobalAlloc (Reserver un espace mémoire)
 GlobalLock (Vérouille un objet mémoire alloué par globalAlloc ou GlobalRealloc)
ReadFile (Lecture de fichier)
Sleep (Mise en sommeil durant nmillisecondes)


Mnemo

AAA - Addition

Flags Modifiés: AF CF (OF,PF,SF,ZF undefined)

AAD - Addition
Flags Modifiés: SF ZF PF (AF,CF,OF undefined)

AAM -
Flags Modifiés: PF SF ZF (AF,CF,OF undefined)

AAS -
Flags Modifiés: AF CF (OF,PF,SF,ZF undefined)

ADC -
Flags Modifiés: AF CF OF SF PF ZF

ADD - Addition
Flags Modifiés: AF CF OF PF SF ZF

AND - Et Logique
Flags Modifiés: CF OF PF SF ZF (AF undefined)

ARPL -
Flags Modifiés: ZF

BOUND -
Flags Modifiés: Aucun

BSF -
Flags Modifiés: ZF

BSR -
Flags Modifiés: ZF

BSWAP -
Flags Modifiés: Aucun

BT -
Flags Modifiés: CF

BTC -
Flags Modifiés: CF

BTR -
Flags Modifiés: CF

BTS -
Flags Modifiés: CF

CALL -
Flags Modifiés: Aucun

CBW -
Flags Modifiés: Aucun

CDQ -
Flags Modifiés: Aucun

CLC -
Flags Modifiés: CF

CLD -
Flags Modifiés: DF

CLI -
Flags Modifiés: IF

CLTS -
Flags Modifiés: Aucun

CMC -
Flags Modifiés: CF

CMP -
Flags Modifiés: AF CF OF PF SF ZF

CMPS -
Flags Modifiés: AF CF OF PF SF ZF

CMPXCHG -
Flags Modifiés: AF CF OF PF SF ZF

CWD -
Flags Modifiés: Aucun

CWDE -
Flags Modifiés: Aucun

DAA -
Flags Modifiés: AF CF PF SF ZF (OF undefined)

DAS -
Flags Modifiés: AF CF PF SF ZF (OF undefined)

DEC -
Flags Modifiés: AF OF PF SF ZF

DIV -
Flags Modifiés: (AF CF OF PF SF ZF undefined)

ENTER -
Flags Modifiés: Aucun

ESC -
Flags Modifiés: Aucun

HLT -
Flags Modifiés: Aucun

IDIV -
Flags Modifiés: (AF CF PF SF ZF OF undefined)

IMUL -
Flags Modifiés: CF OF (AF PF SF ZF undefined)

IN -
Flags Modifiés: Aucun

INC -
Flags Modifiés: AF OF PF SF ZF

INS -
Flags Modifiés: Aucun

INT -
Flags Modifiés: TF IF

INTO -
Flags Modifiés: IF TF

INVD -
Flags Modifiés: Aucun

INVLPG -
Flags Modifiés: Aucun

IRET/IRETD -
Flags Modifiés: AF CF DF IF PF SF TF ZF

JCXZ/JECXZ -
Flags Modifiés: Aucun

JMP -
Flags Modifiés: Aucun

Jxx - Saut conditionnel

Mnemonic | Condition | Description
JA | CF=0 et ZF=0 |
JAE | CF=0 |
JB | CF=1 |
JBE | CF=1 ou ZF=1 |
JC | CF=1 |
JCXZ | CX=0 |
JE | ZF=1 |
JG | ZF=1 et SF=OF |
JGE | ZF=OF |
JL | SF != OF |
JLE | ZF=1 ou SF!= OF |
JNA | CF=1 ou ZF=1 |
JNAE | CF=1 |
JNB | CF=0 |
JNBE | CF=0 et ZF=0 |
JNC | CF=0 |
JNE | ZF=0 |
JNG | ZF=1 ou SF!=OF |
JNGE | SF!=OF |
JNL | SF=OF |
JNLE | ZF=0 et SF=OF |
JNO | OF=0 |
JNP | PF=0 |
JNS | SF=0 |
JNZ | ZF=O |
JO | OF=0 |
JP | PF=1 |
JPE | PF=1 |
JPO | PF=0 |
JS | SF=1 |
JZ | ZF=1 |

LAHF -
Flags Modifiés: Aucun

LAR -
Flags Modifiés: ZF

LDS -
Flags Modifiés: Aucun

LEA-
Flags Modifiés: Aucun

Cette instruction transfert l'adresse d'offset de la source dans le registre de destination.Usage: LEA dest,src equivalent mov dest,offset source

8D / r LEA r16,m Store effective address for m in register r16
8D / r LEA r32,m Store effective address for m in register r32

LEAVE-
Flags Modifiés: Aucun

LES-
Flags Modifiés: Aucun

LFS-
Flags Modifiés: Aucun

LGTD-
Flags Modifiés: Aucun

LGS-
Flags Modifiés: Aucun

LITD-
Flags Modifiés: Aucun

LLDT-
Flags Modifiés: Aucun

LMSW-
Flags Modifiés: Aucun

LOCK-
Flags Modifiés: Aucun

LODS-
Flags Modifiés: Aucun

LOOP-
Flags Modifiés: Aucun

LOOPE/LOOPZ-
Flags Modifiés: Aucun

LOOPNE/LOOPNZ-
Flags Modifiés: Aucun

LSL-
Flags Modifiés: ZF

LSS-
Flags Modifiés: Aucun

LTR-
Flags Modifiés: Aucun

MOV-
Flags Modifiés: Aucun

MOVS-
Flags Modifiés: Aucun

MOVSX-
Flags Modifiés: Aucun

MOVZX-
Flags Modifiés: Aucun

MUL-
Flags Modifiés: CF OF (AF PF SF ZF Non défini)

NEG-
Flags Modifiés: AF CF OF PF SF ZF

NOP- No Operation , ne fait rien
Flags Modifiés: Aucun

Cette fonction occupe un temps définis celon le processeur et permet d'attendre un temps court.

NOT- Logical Not, ET logique
Flags Modifiés: Aucun

OR- Logical Or, OU logique
Flags Modifiés: CF OF PF SF ZF (AF non défini)

OUT- Output Data Port, Sortie sur un port de données.
Flags Modifiés: Aucun

OUTS- Output String To Port, Sortie d'une chaine de caractères sur un port.
Flags Modifiés: Aucun

POP- Pop Off Stack, Dépile, transfert depuis la pile
Flags Modifiés: Aucun

POPA/POPAD- Pop All Register on Stack, Dépile tous les regsitres depuis la pile.
Flags Modifiés: Aucun

POPF/POPFD- Pop Flags off Stack, dépile les flags depuis la pile
Flags Modifiés: Tous forcement.

Place dans le registre de flag le mot(word pour popf) ou le double mot (dword pour popfd) depuis la pile.

PUSH-Push onto stack, empile
Flags Modifiés: Aucun

PUSHA/PUSHAD-Push all registers onto stack, empile tous les registres.
Flags Modifiés: Aucun

PUSHF/PUSHFD-Push flags onto stack, empile le registre de flag
Flags Modifiés: Aucun

RCL- Rotate Throught Carry Left
Flags Modifiés: CF OF

RCR-Rotate Throught Carry Right
Flags Modifiés: CF OF

REP - Repeat String Operation, répète une opération de chaine.
Flags Modifiés: Aucun
Cette instruction répète l'instruction de manipulation de caractère qu'elle reçoit en opérande jusqu'a ce que Cx soit nul. Apres chaque opération elle décrémente CX de 1 et regarde le flag ZERO.
Str1 db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
Str2 db ?
mov si offset Str1
mov di offset Str2
mov cx,7
rep movsb

Une fois executer Str2 contiendra 'ABCDEFG'

F3 6C REP INS r/m8, DX Input (E)CX bytes from port DX into ES:[(E)DI]
F3 6D REP INS r/m16,DX Input (E)CX words from port DX into ES:[(E)DI]
F3 6D REP INS r/m32,DX Input (E)CX doublewords from port DX into ES:[(E)DI]
F3 A4 REP MOVS m8,m8 Move (E)CX bytes from DS:[(E)SI] to ES:[(E)DI]
F3 A5 REP MOVS m16,m16 Move (E)CX words from DS:[(E)SI] to ES:[(E)DI]

F3 A5 REP MOVS m32,m32 Move (E)CX doublewords from DS:[(E)SI] to ES:[(E)DI]
F3 6E REP OUTS DX, r/m8 Output (E)CX bytes from DS:[(E)SI] to port DX
F3 6F REP OUTS DX, r/m16 Output (E)CX words from DS:[(E)SI] to port DX
F3 6F REP OUTS DX, r/m32 Output (E)CX doublewords from DS:[(E)SI] to port DX
F3 AC REP LODS AL Load (E)CX bytes from DS:[(E)SI] to AL
F3 AD REP LODS AX Load (E)CX words from DS:[(E)SI] to AX

F3 AD REP LODS EAX Load (E)CX doublewords from DS:[(E)SI] to EAX
F3 AA REP STOS m8 Fill (E)CX bytes at ES:[(E)DI] with AL
F3 AB REP STOS m16 Fill (E)CX words at ES:[(E)DI] with AX
F3 AB REP STOS m32 Fill (E)CX doublewords at ES:[(E)DI] with EAX

REPE/REPZ-
Flags Modifiés: Aucun

REPNE/REPNZ-
Flags Modifiés: Aucun

RET/RETF-
Flags Modifiés: Aucun

ROL-
Flags Modifiés: CF OF

ROR-
Flags Modifiés: CF OF

SAHF-
Flags Modifiés: AF CF PF SF ZF

SAL/SHL-
Flags Modifiés: CF OF PF SF ZF (AF non défini)

SAR-
Flags Modifiés: Aucun

SBB-
Flags Modifiés: AF CF OF PF SF ZF

SCAS-
Flags Modifiés: Aucun

SETAE/SETNB-
Flags Modifiés: Aucun

SETB/SETNAE-
Flags Modifiés: Aucun

SETBE/SETNA-
Flags Modifiés: Aucun

SETC-
Flags Modifiés: Aucun

SETE/SETZ-
Flags Modifiés: Aucun

SETG/SETNLE-
Flags Modifiés: Aucun

SETGE/SETNL-
Flags Modifiés: Aucun

SETL/SETNGE-
Flags Modifiés: Aucun

SETLE/SETNG-
Flags Modifiés: Aucun

SETNC-
Flags Modifiés: Aucun

SETNE/SETNZ-
Flags Modifiés: Aucun

SETNO-
Flags Modifiés: Aucun

SETNP/SETNPO-
Flags Modifiés: Aucun

SETNS-
Flags Modifiés: Aucun

SETO-
Flags Modifiés: Aucun

SETP/SETPE-
Flags Modifiés: Aucun

SETS-
Flags Modifiés: Aucun

SGDT-
Flags Modifiés: Aucun

SHL-
Flags Modifiés: CF OF PF SF ZF (AF Non défini)

SHLD/SHRD-
Flags Modifiés: CF PF SF ZF (OF AF Non défini)

SHR-
Flags Modifiés: CF OF PF SF ZF (AF Non défini)

SIDT-
Flags Modifiés: Aucun

SLDT-
Flags Modifiés: Aucun

SMSW-
Flags Modifiés: Aucun

STC-
Flags Modifiés: CF

STD-
Flags Modifiés: DF

STI-
Flags Modifiés: IF

STOS-
Flags Modifiés: Aucun

STR-
Flags Modifiés: Aucun

SUB-
Flags Modifiés: AF CF OF PF SF ZF

TEST-
Flags Modifiés: CF OF PF SF ZF (AF non défini)

VERR-
Flags Modifiés: ZF

VERW-
Flags Modifiés: ZF

WAIT/FWAIT-
Flags Modifiés: Aucun

WBINVD-
Flags Modifiés: Aucun

XCHG-
Flags Modifiés: Aucun

XLAT/XLATB-
Flags Modifiés: Aucun

XOR- Exclusive OR, OU exclusif
Flags Modifiés: CF OF PF SF ZF (AF non défini)


User32

User32.dll*

Cette librairie est dite utilisateur, c'est elle qui va vous permettre de créer vos fenêtres et intéragir avec. Quelques fonctions inclusent dans la librairie User32

AdjustWindowRect (Calcul la taille extérieur d'une fenêtre à partir de la taille client souhaitée)
DialogBoxParam (Créer une boite de dialogue a partir d'une ressource)
GetDlgItem (Retourne le handle d'un controle)
 ShowWindow (Change l'état de la fenêtre, permet de la montrer, la cacher ...)


Sommaire

BONJOUR
Musique "Invention BWV784" J.S. BACH 1685-1750

Designation

- Designation -

Nous veillons aux respects des droits d'auteur : si par erreur un contenu protégé est disponible sans indication sur ce site, merci de contacter l'administrateur, il sera retiré ou mis à jour dans les plus brefs délais.