Decimal-Binary-Hexadecimal Conversion Chart
Transcription
Decimal-Binary-Hexadecimal Conversion Chart
Decimal-Binary-Hexadecimal Conversion Chart This chart shows all of the combinations of decimal, binary and hexadecimal from 0 to 25 5 decimal. When m aking a change in a C V this chart will show the conversion for different nu mb ering system s. Som e deco ders sp lit the C V in to tw o pa rts. W hen y ou mo dify a CV you need to w rite back all 8 bits. T his cha rt will help deter min e the co rrect bit va lue a C V. Decimal Bit N o.> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 Binary Hex 00000000 00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000 00001001 00001010 00001011 00001100 00001101 00001110 00001111 00010000 00010001 00010010 00010011 00010100 00010101 00010110 00010111 00011000 00011001 00011010 00011011 00011100 00011101 00011110 00011111 00100000 00100001 00100010 00100011 00100100 00100101 00100110 00100111 00101000 00101001 00101010 00101011 00101100 00101101 00101110 00101111 00110000 00110001 00110010 00110011 00110100 00110101 00110110 00110111 00111000 00111001 00111010 00111011 00111100 00111101 00111110 00111111 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F CVs CV-6 M id Point Voltage CV -7 Ver N um ber CV-8 M aker ID CV -17 /18 Lo ng A ddress CV -19 Co nsist A ddress CV-21 Advance Consist function control Binary Hex Decimal 76543210 Binary Num ber System for one byte Bit Number| 7| 6| 5| 4|3|2|1|0| Bit Weight|128|64|32|16|8|4|2|1| Some Commonly used CV -1 S hort Ad dress CV-2 Start Voltage CV -3 Acc eleration Ra te CV -4 D eceleratio n R ate CV-5 M aximum Voltage Decimal 76543210 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 01000000 01000001 01000010 01000011 01000100 01000101 01000110 01000111 01001000 01001001 01001010 01001011 01001100 01001101 01001110 01001111 01010000 01010001 01010010 01010011 01010100 01010101 01010110 01010111 01011000 01011001 01011010 01011011 01011100 01011101 01011110 01011111 01100000 01100001 01100010 01100011 01100100 01100101 01100110 01100111 01101000 01101001 01101010 01101011 01101100 01101101 01101110 01101111 01110000 01110001 01110010 01110011 01110100 01110101 01110110 01110111 01111000 01111001 01111010 01111011 01111100 01111101 01111110 01111111 Binary Hex Decimal 76543210 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 10000000 10000001 10000010 10000011 10000100 10000101 10000110 10000111 10001000 10001001 10001010 10001011 10001100 10001101 10001110 10001111 10010000 10010001 10010010 10010011 10010100 10010101 10010110 10010111 10011000 10011001 10011010 10011011 10011100 10011101 10011110 10011111 10100000 10100001 10100010 10100011 10100100 10100101 10100110 10100111 10101000 10101001 10101010 10101011 10101100 10101101 10101110 10101111 10110000 10110001 10110010 10110011 10110100 10110101 10110110 10110111 10111000 10111001 10111010 10111011 10111100 10111101 10111110 10111111 CV-22 Advance Consist headlight control CV -23 Adva nce C onsist acceler ation r ate CV -24 Adva nce C onsist decelera tion ra te SEE YOUR DECODER MANUAL FOR ALL OF THE CVs IT USES AND THE RANGE OF VALUES. Binary Hex 76543210 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 11000000 11000001 11000010 11000011 11000100 11000101 11000110 11000111 11001000 11001001 11001010 11001011 11001100 11001101 11001110 11001111 11010000 11010001 11010010 11010011 11010100 11010101 11010110 11010111 11011000 11011001 11011010 11011011 11011100 11011101 11011110 11011111 11100000 11100001 11100010 11100011 11100100 11100101 11100110 11100111 11101000 11101001 11101010 11101011 11101100 11101101 11101110 11101111 11110000 11110001 11110010 11110011 11110100 11110101 11110110 11110111 11111000 11111001 11111010 11111011 11111100 11111101 11111110 11111111 C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF Bit 1=Speed step 28 Bit 2 =d .c. enable Bit 3= Advance acknow ledgment Bit 4 = A lternate sp eed tab le Bit 5= Lo ng a ddress. CV -66 Forw ard T rim CV -67 to 94 Speed T able CV-95 Reverse Trim DEF 24April02 CV -29 C onfiguration R egister Bit 0= Direction of travel 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 0 1 2 3 4 5 6 7 8 9 A B C D E F 1 1 2 3 4 5 6 7 8 9 A B C D E F 0 2 2 3 4 5 6 7 8 9 A B C D E F 0 1 3 3 4 5 6 7 8 9 A B C D E F 0 1 2 4 4 5 6 7 8 9 A B C D E F 0 1 2 3 5 5 6 7 8 9 A B C D E F 0 1 2 3 4 6 6 7 8 9 A B C D E F 0 1 2 3 4 5 7 7 8 9 A B C D E F 0 1 2 3 4 5 6 8 8 9 A B C D E F 0 1 2 3 4 5 6 7 9 9 A B C D E F 0 1 2 3 4 5 6 7 8 A A B C D E F 0 1 2 3 4 5 6 7 8 9 B B C D E F 0 1 2 3 4 5 6 7 8 9 A C C D E F 0 1 2 3 4 5 6 7 8 9 A B Tab. 1 – Table d’addition hexadécimale 0 1 2 3 4 5 6 7 8 9 A B C D E F 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Tab. 2 – Correspondance hexadécimal-binaire D D E F 0 1 2 3 4 5 6 7 8 9 A B C E E F 0 1 2 3 4 5 6 7 8 9 A B C D F F 0 1 2 3 4 5 6 7 8 9 A B C D E Hexadecimal Multiplication Table Examples: Les registres en ASM Les registres généraux 32bits 16bits 8bits Nom Description EAX AX AH/AL Accumulateur Registre d'entrée/sortie ; opérations arithmétiques EBX BX BH/BL Base ECX CX CH/CL Compteur Nombre d'itérations à exécuter dans une boucle. Évalue en entrée. EDX DX DH/DL Données Adresse d'un tampon de données que l'on veut manipuler. Les registres de segment 16bits Nom Description CS Code segment Adresse de segment de la prochaine instruction à exécuter. DS Data segment Adresse du segment des données du programme en cours. ES Extra segment Adresse du segment de son choix. SS Stack segment Adresse du segment de pile. Les registres d'offset 32bits 16bits Nom Description EIP IP Instruction pointer Offset de la prochaine instruction à exécuter (CS:IP → adresse absolue). Incrémenté à chaque nouvelle instruction. ESP SP Stack pointer Offset du sommet de la pile. Ajout d'un mot → décrémenté de 2. ESI SI Source index Manipulation de chaînes : source. EDI DI Destination index Manipulation de chaînes : destination. EBP BP Base pointer Le décalage d'une position dans la pile : ponter sur une donnée. Les registres des indicateurs (flags) 1bit/32 Nom Description CF Carry Flag Indicateur de retenue : 1 si l'opération a produit une retenue. AF Auxiliary carry Flag PF Parity Flag Indicateur de parité : 1 si le résultat est pair. ZF Zero Flag Indicateur de nullité : 1 si le résultat est nul. SF Sign Flag Indicateur de signe : 1 si le résultat d'une opération sur des nombres signés est négatif. IF Interrupt Flag Empêche les appels d'interruption lorsqu'il est positionné à 1. DF Direction Flag S'il vaut 1, les chaînes de caractères sont parcourues dans le sens des adresses décroissantes. OF Overflow Flag En arithmétique signée, indique qu'un débordement s'est produit. TF Trap Flag Positionné à 1 pour exécuter les intructions pas à pas, en appelant INT 1 à chaque fois. Utile pour débugger. qaco Microprocesseur 8086 par A. Oumnad 33 3 L’ASSEMBLEUR NASM La syntaxe des mnémoniques que nous avons utilisée jusqu’à présent est la syntaxe de l’assembleur NASM. Rappelons que le rôle de l’assembleur est de convertir le programme source écrit en mnémonique en codes machines compréhensible par le processeur. 3.1 LES DIRECTIVES DE NASM Les directives ne sont pas des instructions du 8086, elles sont destinées à l'assembleur qui les utilise pour savoir de quelle manière il doit travailler. BITS Cette directive indique à NASM s'il doit produire un code 16 bits ou un code 32 bits. Elle est utilisée sous la forme : BITS 16 ou BITS 32 ORG Cette directive indique à l'assembleur l'adresse à partir de laquelle le programme sera implanté dans la RAM. Pour les programmes ".com", cette adresse doit être 100h SEGMENT Cette directive précise dans quel segment, les instructions ou les données qui la suivent seront assemblées : SEGMENT .text Les instructions ou les données initialisée (par db ou dw) qui suivent cette 'déclaration' seront placé dans le segment programme (Code segment) SEGMENT .data Les données (initialisée) déclarée après cette directive sont placée dans le segment de données (Data segment) SEGMENT .bss Les données déclarées après cette directive seront placées dans le segment de données mais cette partie est réservée à la déclaration des variables non initialisée. %INCLUDE Comme en langage C, cette directive permet d'inclure un fichier source avant la compilation. EQU : Définition de constante mille EQU 1000 Chaque fois que l'assembleur rencontrera la chaîne mille , il la remplacera par le nombre 1000 (tout simplement). %DEFINE La directive %define permet de définir une constante un peut de la même façon que la directive EQU . La différence subtile est que %define définit une macros qu'on peur redéfinir dans la suite du programme ce qui n'est pas possible avec EQU . Microprocesseur 8086 par A. Oumnad 34 3.2 LES PSEUDO INSTRUCTION DE NASM Les pseudo instructions ne sont pas des instructions du 8086. Elles ne seront donc pas traduites en langage machine lors de l'assemblage. NASM les interprète et réalise les fonctions correspondantes. Les pseudo instructions les plus courantes servent à la déclaration des variables initialisées ou non initialisées, définition de constantes et la répétition des instructions : db : (define byte) définit une variable initialisée de 1 octet dw : (define word) définit une variable initialisée de 2 octets resb : réserve un octet pour une variable non initialisée resw : réserve un mot de 2 octets pour une variable non initialisée 3.3 LES EXPRESSIONS NASM peut évaluer des expressions entre constantes. Les opérateur reconnus sont : +, - , * : addition, soustraction et multiplication / : division non signée // : division signée % : modulo non signé %% : modulo signé ~ : complément logique & : ET logique | : OU logique ^ : XOR logique ≪ : décalage à gauche ≫ : décalage à droite x equ 0F00h mov ax,(2*x+6)/2 mov ax,x << 4 mov ax,(x >> 8)+(x << 4) mov ax,x & x >> 4; >> est prioritaire sur & mov ax,x | x >> 4; >> est prioritaire sur | Attention, les expressions ne peuvent être utilisés qu’avec des constantes. On ne peut pas avoir des choses du genre : MOV AX , DX+2 Jeu d'instruction x86 1 Jeu d'instruction x86 Le jeu d'instructions du x86 a subi de nombreux changements au cours du temps. La plupart d'entre eux ne sont que des ajouts au jeu d'instruction initial afin d'apporter de nouvelles fonctionnalités. Jeu d'instruction sur les entiers Ceci est le jeu d'instruction complet pour les processeurs 8086-8088 et la plupart, si ce n'est toutes ces instructions sont accessibles en mode 32-bit. Elles opèrent alors sur les registres et valeurs 32 bits (eax, ebx, etc.) en lieu et place de leur contrepartie en 16 bits (ax, bx, etc.). Instructions originales des 8086/8088 Nom Sens Traduction Notes AAA ASCII Adjust AL after Ajuste le registre AL après addition Addition (mode ASCII) Utilisé avec le codage BCD non compacté AAD ASCII Adjust AX after Ajuste le registre AX après division Division (mode ASCII) Utilisé avec le codage BCD non compacté, bogué dans le jeu d'instruction original, mais « réparé » dans le NEC V20, causant de nombreuses incompatibilités AAM ASCII Adjust AX after Ajuste le registre AX après Multiplication multiplication (mode ASCII) Utilisé avec le codage BCD non compacté AAS ASCII Adjust AL after Ajuste le registre AL après soustraction Subtraction (mode ASCII) Utilisé avec le codage BCD non compacté ADC Add with Carry Ajoute deux entiers, plus le drapeau de retenue Le résultat remplace le premier opérande ADD Add Ajoute deux entiers Le résultat remplace le premier opérande AND Logical AND Effectue un ET logique des opérandes Le résultat remplace le premier opérande CALL Call Procedure Appelle une procédure CBW Convert Byte to Word Convertit un octet en mot CLC Clear Carry Flag Met le drapeau de retenue à zéro CLD Clear Direction Flag Met le drapeau de direction à zéro CLI Clear Interrupt Flag Met le drapeau d'interruption à zéro CMC Complement Carry Flag Inverse le drapeau de retenue CMP Compare Compare deux entiers (de façon arithmétique) Positionne les drapeaux en fonction de la différence entre les opérandes CMPSzz Compare Strings Compare un octet/mot de deux chaînes Mnémoniques : CMPS, CMPSB, CMPSW CWD Convert Word to Doubleword Convertit un mot en double mot Le registre AX est étendu à DX:AX DAA Decimal Adjust AL after Addition Ajuste le registre AL après addition (mode décimal) Utilisé avec le codage BCD compacté DAS Decimal Adjust AL after Subtraction Ajuste le registre AL après soustraction (mode décimal) Utilisé avec le codage BCD compacté DEC Decrement by 1 Décrémente un entier Ôte un de l'opérande DIV Unsigned Divide Divise par un entier non signé Le dividende est le registre AX/DX:AX, le quotient est écrit dans AL/AX et le reste dans AH/DX Le registre AL est étendu à AX Jeu d'instruction x86 2 ESC Escape Utilisé avec l'unité de calcul en virgule flottante HLT Halt Entre en état d'arrêt jusqu'à réception d'une interruption Permet de réduire la consommation de puissance du processeur. Alias : HALT IDIV Signed Divide Divise par un entier signé Le dividende est le registre AX/DX:AX, le quotient est écrit dans AL/AX et le reste dans AH/DX IMUL Signed Multiply Multiplie par un entier signé Le facteur est le registre AL/AX et le produit est écrit dans AX/DX:AX IN Input from Port Lit depuis un port La destination est le registre AL/AX INC Increment by 1 Incrémente un entier Ajoute un à l'opérande INT Call to Interrupt Procedure Appelle l'interruption identifiée par l'opérande INTO Call to Interrupt Procedure if Overflow Appelle l'interruption de débordement si le drapeau de débordement est à un IRET Interrupt Return Revient d'une interruption Jcc Jump if Condition Is Met Saute si une condition est vérifiée JMP Jump Saute (inconditionnel) LAHF Load Flags into AH Copie le registre des drapeaux dans le registre AH LDS Load DS with Far Pointer Charge un pointeur de type far (lointain) dans le registre DS (segment) et l'opérande (décalage) LEA Load Effective Address Charge l'adresse du second opérande dans le premier LES Load ES with Far Pointer Charge un pointeur de type far (lointain) dans le registre ES (segment) et l'opérande (décalage) LOCK Assert LOCK# Signal Prefix Préfixe verrouillant les bus pour les prochaines instructions Utilisé pour les plates-formes multiprocesseurs. LODSzz Load String Copie un octet/mot d'une chaîne La destination est le registre AL/AX. Mnémoniques : LODS, LODSB, LODSW LOOPcc Loop According to Counter Décrémente le compteur et saute si une condition est vérifiée Le compteur est le registre CX. Mnémoniques : LOOP, LOOPE, LOOPNE, LOOPNZ, LOOPZ MOV Move Copie le second opérande dans le premier Mnémoniques : JA, JAE, JB, JBE, JC, JCXZ, JE, JG, JGE, JL, JLE, JNA, JNAE, JNB, JNBE, JNC, JNE, JNG, JNGE, JNL, JNLE, JNO, JNP, JNS, JNZ, JO, JP, JPE, JPO, JS, JZ MOVSzz Move from String to String Copie un octet/mot d'une chaîne vers une Mnémoniques : MOVS, MOVSB, MOVSW autre MUL Unsigned Multiply Multiplie par un entier non signé Le facteur est le registre AL/AX et le produit est écrit dans AX/DX:AX NEG Two's Complement Negation Calcule l'opposé de l'opérande (négation par complément à deux) Le résultat remplace l'opérande NOP No Operation Ne fait rien NOT One's Complement Negation Effectue un NON logique (négation par complément à un) Le résultat remplace l'opérande OR Logical Inclusive OR Effectue un OU logique inclusif des opérandes Le résultat remplace le premier opérande Jeu d'instruction x86 3 OUT Output to Port Écrit vers un port La source est le registre AX/AL POP Pop a Value from the Stack Dépile vers le registre opérande POPF Pop Flags Register from the Stack Dépile vers le registre des drapeaux PUSH Push a Value onto the Stack Empile le registre opérande PUSHF Push Flags Register onto the Stack Empile le registre des drapeaux RCL Rotate through Carry Left Effectue une rotation à gauche via par le drapeau de retenue RCR Rotate through Carry Right Effectue une rotation à droite via par le drapeau de retenue REPcc Repeat String Operation Prefix Préfixe de répétition d'une opération sur une chaîne RET Return from Procedure Revient d'une procédure appelée avec décalage seul L'adresse de retour (décalage) est sur la pile. Un opérande optionnel peut indiquer le nombre d'octets supplémentaire à dépiler. RETF Return from Far Procedure Revient d'une procédure appelée avec segment et décalage L'adresse de retour (segment et décalage) est sur la pile. Un opérande optionnel peut indiquer le nombre d'octets supplémentaire à dépiler. ROL Rotate Left Effectue une rotation vers la gauche ROR Rotate Right Effectue une rotation vers la droite SAHF Store AH into Flags Copie le registre AH dans le registre des drapeaux SAL Shift Arithmectically Left Décalage arithmétique vers la gauche SALC Set AL from Carry Flag Copie la valeur 0xFF dans le registre AL Initialement non documenté. Alias : SETALC si CF vaut 1, ou 0x00 sinon SAR Shift Arithmectically Right Décalage arithmétique vers la droite À ne pas confondre avec SHR SBB Integer Subtraction with Borrow Soustrait deux entiers, ajoute le drapeau de retenue Le résultat remplace le premier opérande SCASzz Scan String Compare un octet/mot d'une chaîne La référence est le registre AL/AX. Mnémoniques : SCAS, SCASB, SCASW SHL Shift Left Décalage logique à gauche Même instruction que SAL SHR Shift Right Décalage logique à droite À ne pas confondre avec SAR STC Set Carry Flag Met le drapeau de retenue à un STD Set Direction Flag Met le drapeau de direction à un STI Set Interrupt Flag Met le drapeau d'interruption à un STOSzz Store in String Copie dans un octet/mot d'une chaîne La source est le registre AL/AX. Mnémoniques : STOS, STOSB, STOSW SUB Subtract Soustrait deux entiers Le résultat remplace le premier opérande TEST Logical Compare Compare deux opérandes (de façon logique) Positionne les drapeaux en fonction du résultat du ET logique entre les opérandes WAIT Wait Attend tant que la broche BUSY du processeur est inactive Utilisé avec l'unité de calcul en virgule flottante Mnémoniques : REP, REPE, REPNE, REPNZ, REPZ Même instruction que SHL Jeu d'instruction x86 4 XCHG Exchange Permute le contenu des deux opérandes XLAT Table Look-up Translation Translation de donnée entre des tables Alias : XLATB XOR Logical Exclusive OR Effectue un OU logique exclusif des opérandes Le résultat remplace le premier opérande Ajouts aux processeurs spécifiques Ajouts aux processeurs 80186/80188 BOUND, ENTER, INSB, INSW, LEAVE, OUTSB, OUTSW, POPA, PUSHA, PUSHW Ajouts au processeur 80286 ARPL, CLTS, LAR, LGDT, LIDT, LLDT, LMSW, LOADALL, LSL, LTR, SGDT, SIDT, SLDT, SMSW, STR, VERR, VERW Ajouts au processeur 80386 BSF, BSR, BT, BTC, BTR, BTS, CDQ, CMPSD, CWDE, INSD, IRETD, IRETDF, IRETF, JECXZ, LFS, LGS, LSS, LODSD, LOOPD, LOOPED, LOOPNED, LOOPNZD, LOOPZD, MOVSD, MOVSX, MOVZX, OUTSD, POPAD, POPFD, PUSHAD, PUSHD, PUSHFD, SCASD, SETA, SETAE, SETB, SETBE, SETC, SETE, SETG, SETGE, SETL, SETLE, SETNA, SETNAE, SETNB, SETNBE, SETNC, SETNE, SETNG, SETNGE, SETNL, SETNLE, SETNO, SETNP, SETNS, SETNZ, SETO, SETP, SETPE, SETPO, SETS, SETZ, SHLD, SHRD, STOSD Ajouts au processeur 80486 BSWAP, CMPXCHG, CPUID, INVD, INVLPG, RSM, WBINVD, XADD Ajouts au processeur Pentium CMPXCHG8B, RDMSR, RDPMC*, RDTSC, WRMSR • RDPMC a été introduit avec le processeur Pentium Pro et le processeur Pentium MMX Ajouts au processeur Pentium Pro CMOVA, CMOVAE, CMOVB, CMOVB, CMOVE, CMOVG, CMOVGE, CMOVL, CMOVLE, CMOVNA, CMOVNAE, CMOVNB, CMOVNBE, CMOVNC, CMOVNE, CMOVNG, CMOVNGE, CMOVNL, CMOVNLE, CMOVNO, CMOVNP, CMOVNS, CMOVNZ, CMOVO, CMOVP, CMOVPE, CMOVPO, CMOVS, CMOVZ, SYSENTER, SYSEXIT, UD2 Ajouts au processeur AMD K7 • SYSCALL - Fonctionnalité spécifique au processeur AMD équivalente à l'instruction SYSENTER. • SYSRET - Fonctionnalité spécifique au processeur AMD équivalente à l'instruction SYSEXIT. Ajouts au processeur Pentium III Fonctionnalités SSE MASKMOVQ, MOVNTPS, MOVNTQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE (Mise en cache et ordonnancement mémoire (Memory Ordering)) Guide de référence rapide de l'assembleur x86 Les registres: %eax %ebx %ecx %edx %esi %edi %ebp %esp. Ils contiennent tous un entier de 32 bits (4 octets), qui peut aussi être vu comme une adresse. Le registre %esp est spécial, et pointe sur le sommet de pile; il est modifié par les instructions pushl, popl, call, ret notamment. Il y a aussi d'autres registres que l'on ne peut pas manipuler directement. (L'instruction info registers sous gdb ou ddd vous les montrera.) Le plus important est eip, le compteur de programme: il contient en permanence l'adresse de la prochaine instruction à exécuter. 1em • addl <source>, <dest>.......<dest>= <dest>+ <source> (addition) Ex: addl $1, %eax ajoute 1 au registre %eax. Ex: addl $4, %esp dépile un élément de 4 octets de la pile. Ex: addl %eax, (%ebx, %edi, 4) ajoute le contenu de %eax à la case mémoire à l'adresse %ebx + 4*%edi. (Imaginez que %ebx est l'adresse de début d'un tableau a, %edi est un index i, ceci stocke %eax dans a[i].) • andl <source>, <dest>.......<dest>= <dest>& <source> (et bit à bit) • call <dest>.......appel de procédure à l'adresse <dest> Équivalent à pushl $a, où a est l'adresse juste après l'instruction call (l'adresse de retour), suivi de jmp <dest>. Ex: call printf appelle la fonction printf. Ex: call *%eax (appel indirect) appelle la fonction dont l'adresse est dans le registre %eax. Noter qu'il y a une irrégularité dans la syntaxe, on écrit call *%eax et non call (%eax). • cltd .......conversion 32 bits -> 64 bits Convertit le nombre 32 bits dans %eax en un nombre sur 64 bits stocké à cheval entre %edx et %eax. Note: %eax n'est pas modifié; %edx est mis à 0 si %eax est positif ou nul, à −1 sinon. À utiliser notamment avant l'instruction idivl. • cmp <source>, <dest>.......comparaison Compare les valeurs de <source> et <dest>. Utile juste avant un saut conditionnel (je, jge, etc.). À noter que la comparaison est faite dans le sens inverse de celui qu'on attendrait. Par exemple, cmp <source>, <dest> suivi d'un jge (“jump if greater than or equal to”), va effectuer le saut si <dest>≥<source>: on compare <dest> à <source>, et non le contraire. • idivl <dest>.......division entière et reste Divise le nombre 64 bits stocké en %edx et %eax (cf. cltd) par le nombre 32 bits <dest>. Retourne le quotient en %eax, le reste en %edx. • imull <source>, <dest>.......multiplie <dest> par <source>, résultat dans <dest> • jmp <dest>.......saut inconditionnel: eip=<dest> • je <dest>.......saut conditionnel Saute à l'adresse <dest> si la comparaison précédente (cf. cmp) a conclu que <dest>=<source>, continue avec le flot normal du programme sinon. • jg <dest>.......saut conditionnel Saute à l'adresse <dest> si la comparaison précédente (cf. cmp) a conclu que <dest>><source>, continue avec le flot normal du programme sinon. • jge <dest>.......saut conditionnel Saute à l'adresse <dest> si la comparaison précédente (cf. cmp) a conclu que <dest>≥<source>, continue avec le flot normal du programme sinon. • jl <dest>.......saut conditionnel Saute à l'adresse <dest> si la comparaison précédente (cf. cmp) a conclu que <dest><<source>, continue avec le flot normal du programme sinon. • jle <dest>.......saut conditionnel Saute à l'adresse <dest> si la comparaison précédente (cf. cmp) a conclu que <dest>≤<source>, continue avec le flot normal du programme sinon. • leal <source>, <dest>.......chargement d'adresse effective Au lieu de charger le contenu de <source> dans <dest>, charge l'adresse de <source>. Équivalent C: <dest>=&<source>. • movl <source>, <dest>.......transfert Met le contenu de <source> dans <dest>. Équivalent C: <dest>=<source>. Ex: movl %esp, %ebp sauvegarde le pointeur de pile %esp dans le registre %ebp. Ex: movl %eax, 12(%ebp) stocke le contenu de %eax dans les quatre octets commençant à %ebp+12. Ex: movl (%ebx, %edi, 4), %eax lit le contenu de la case mémoire à l'adresse %ebx + 4*%edi, et le met dans %eax. (Imaginez que %ebx est l'adresse de début d'un tableau a, %edi est un index i, ceci stocke a[i] dans %eax.) • negl <dest>.......<dest>=-<dest>(opposé) • notl <dest>.......<dest>=~<dest>(non bit à bit) • orl <source>, <dest>.......<dest>= <dest>| <source> (ou bit à bit) • popl <dest>.......dépilement Dépile un entier 32 bits de la pile et le stocke en <dest>. Équivalent à movl (%esp),<dest> suivi de addl $4, %esp. Ex: popl %ebp récupère une ancienne valeur de %ebp sauvegardée sur la pile, typiquement, par pushl. • pushl <source>.......empilement Empile l'entier 32 bits <source> au sommet de la pile. Équivalent à movl <source>, -4(%esp) suivi de subl $4, %esp. Ex: pushl %ebp sauvegarde la valeur de %ebp, qui sera rechargée plus tard par popl. Ex: pushl <source> permet aussi d'empiler les arguments successifs d'une fonction. (Note: pour appeler une fonction C comme printf par exemple, il faut empiler les arguments en commençant par celui de droite.) • ret .......retour de procédure Dépile une adresse de retour a, et s'y branche. Lorsque la pile est remise dans l'état à l'entrée d'une procédure f, ceci a pour effet de retourner de f et de continuer l'exécution de la procédure appelante. Équivalent à popl eip... si cette instruction existait (il n'y a pas de mode d'adressage permettant de manipuler eip directement). • subl <source>, <dest>.......<dest>= <dest>- <source>(soustraction) Ex: subl $1, %eax retire 1 du registre %eax. Ex: subl $4, %esp alloue de la place pour un nouvel élément de 4 octets dans la pile. • xorl <source>, <dest>.......<dest>= <dest>^ <source> (ou exclusif bit à bit) Microprocesseur 8086 par A. Oumnad 42 5 CODE MACHINE DES INSTRUCTIONS Une instruction peut comporter de 1 à 7 octets dont 1 ou 2 octets pour coder l'opération, les autres servent à définir les opérandes. Dans le cas le plus général, l’instruction se fait entre un registre et une case mémoire. Dans le code machine de l’instruction, on trouvera le code de l’opération (CO), le code du registre utilisé (REG), le code du mode d’adressage utilisé (MOD) et le code permettant de déterminer l’adresse de la case mémoire (ADR): Le premier octet est un octet optionnel qui représente un préfix qui peut être un préfix de répétition ou un préfix de changement de segment. Le 2ème octet dit Code Opération se présente comme suit : 7 6 5 4 3 2 CO 1 0 d w CO : C'est le code proprement dit de l'instruction d : désigne la destination du résultat d=0 Résultat dans mémoire ou opération entre 2 registres d=1 Résultat dans registre w : Opération 8 bits ou 16 bits w=0 8 bits w=1 16 bits Le 3ème octet permet de définir les opérandes 7 6 MOD 5 4 REG 3 2 1 0 ADR MOD : Ce champ de 2 bits nous informe sur le mode d'adressage : registre, directe ou la nature du déplacement dans les autres cas, REG : Ce champ de 3 bits désigne le registre constituant un opérande ADR : Ce champs de 3 bits précise l’adresse de l’autre opérande quand il s´agit d’une position mémoire. Pour une opération entre deux registres R R : REG = Registre source ADR = Registre destination Les octets suivants concernent : Les déplacements sur 8 ou 16 bits utilisés dans le calcul d'adresse Les donnés sur 8 ou 16 bits dans le cas de l'adressage immédiat ... Microprocesseur 8086 43 par A. Oumnad 5.1 LES CODES REG, ADR ET MOD REG w=1 000 001 010 011 100 101 110 111 00 ES MOD ADR AX CX DX BX SP BP w=0 000 AL 001 CL 010 DL 011 BL 100 AH 101 CH 000 001 010 011 100 101 SI 110 DH 110 DI 111 REG Segment 01 10 CS SS BH 111 BX+SI+d BX+DI+d BP+SI+d BP+DI+d SI+d DI+d - BP+d - Direct BX+d 00 - Directe - Indirecte avec dep = 0 Indirect déplacement court : 8 bits, 127, 1 ou 2 chiffres hex Indirect dép. long : 16 bits, 10 128 , + de 2 chiffres hex R ← R ou R ← im 11 Dans ce cas : ADR= code registre destination 01 Préfix de changement de segment 11 DS ES 26h CS 2Eh 5.2 TABLEAU DES CODES BINAIRES AAA AAD AAM AAS ADC R/M R R/M im AL/AX im ADD R/M R R/M im (**) AL/AX im AND R/M R R/M im Ac im BOUND CALL intra segment direct intra segment indirect inter segment direct inter segment indirect CBW CLC CLD CLI CMC CMP R/M R R/M im AL/AX im 0011 0111 1101 0101 1101 0100 0011 1111 0000 1010 0000 1010 0001 00dw 1000 00sw 0001 010w MOD REG ADR MOD 010 ADR donnée (Adr ou dep) (Adr ou dep) donnée 0000 00dw 1000 00sw 0000 010w MOD REG ADR MOD 000 ADR donnée (Adr ou dep) (Adr ou dep) donnée 0010 00dw 1000 000w 0010 010w 0110 0010 MOD REG ADR MOD 100 ADR donnée MOD REG ADR (Adr ou dep) (Adr ou dep) donnée 1110 1000 1111 1111 1001 1010 adresse MOD 010 ADR Adresse (Adr ou dep) (Dep) Segment 1001 1000 1111 1000 1111 1100 1111 1010 1111 0101 0011 10dw 1000 00sw 0011 110w MOD REG ADR MOD 111 ADR Donnée (Adr ou dep) (Adr ou dep) donnée SS 36h DS 3Eh Microprocesseur 8086 44 par A. Oumnad CMPS CWD DAA DAS DEC R/M 8 bits R 16 bits DIV R/M ENTER EDC HLT IDIV R/M IMUL R/M IN Port défini Port dans DX INC R/M 8 bits R 16 bits INS INT INTO IRET JA JAE JB JBE JC JCXZ JE JG JGE JL JLE JMP intra segment direct intra segment direct court intra segment indirect inter segment direct inter segment indirect 1010 011w 1001 1001 0010 0111 0010 1111 JNC JNE JNO JNS JNP JO JP JS LAHF LDS 0111 0011 0111 0101 0111 0001 0111 1001 0111 1011 0111 0000 0111 1010 0111 1000 1001 1111 1100 0101 1111 111w 01001 REG 1111 011w 1100 1000 1111 0100 1111 011w 1111 011w MOD 001 ADR (Adr ou dep) MOD 110 ADR donnée (Adr ou dep) MOD 111 ADR MOD 101 ADR (Adr ou dep) (Adr ou dep) 1110 010w 1110 110w Port 1111 111w 01000 REG 0110 110w 1100 1101 1100 1110 1100 1111 0111 0111 0111 0011 0111 0010 0111 0110 1110 0010 1110 0011 0111 0100 0111 1111 0111 1101 0111 1100 0111 1110 MOD 000 ADR 1110 1001 1110 1011 1111 1111 1110 1010 1111 1111 (Adr ou dep) Num. interruption DepRel_8 DepRel_8 DepRel_8 DepRel_8 DepRel_8 DepRel_8 DepRel_8 DepRel_8 DepRel_8 DepRel_8 DepRel_8 (jmp etiq) Dep_Relatif_16 Dep_Relatif_8. (jmp short etiq) MOD 100 ADR Adr. branch.16 SegL MOD 101 ADR DepRel_8 DepRel_8 DepRel_8 DepRel_8 DepRel_8 DepRel_8 DepRel_8 DepRel_8 MOD REG ADR (Adr ou dep) SegH Microprocesseur 8086 LEA LEAVE LES LOCK LODS LOOP LOOPZ LOOPNZ MOV R/M R m im R im AX/AL M_direct M_direct AX/AL Rseg R/M R/M Rseg MOVS MUL R/M NEG NOP NOT OR R/M R R/M im AX/AL im OUT port défini port dans DX OUTS POP M R Rseg POPA (*) POPF PUSH M R Rseg PUSHA (*) PUSHF RCL R/M,1 R/M,CL R/M,im8 (*) RCR R/M,1 R/M,CL R/M,im8 (*) REP/REPZ, REPNZ 45 par A. Oumnad 10001101 11001001 1100 0100 1111 0000 1010 110w 1110 0010 1110 0001 1110 0000 MOD REG ADR (Adr ou dep) MOD REG ADR (Adr ou dep) DepRel_8 DepRel_8 DepRel_8 1000 10dw MOD REG ADR (Adr ou dep) 1100 011w MOD 000 ADR (Adr ou dep) 1011 w REG donée 1010 000w Adresse 1010 001w Adresse 1000 1110 MOD 0 Rseg ADR (Adr ou dep) 1000 1100 MOD 0 Rseg ADR (Adr ou dep) 1010 010w 1111 011w MOD 100 ADR (Adr ou dep) 1111 011w MOD 011 ADR (Adr ou dep) 1001 0000 1111 011w MOD 010 ADR (Adr ou dep) donnée 0000 10dw 1000 000w 0000 110w MOD REG ADR MOD 001 ADR donnée 1110 011w 1110 111w 0110 111w port 1000 1111 0101 1REG 000REG111 0100 0001 1001 1101 MOD 000 ADR (Adr ou dep) 1111 1111 01010 REG 000REG110 0110 0000 1001 1100 MOD 000 ADR (Adr ou dep) 1101 000w 1101 001w 1100 000w MOD 010 ADR MOD 010 ADR MOD 010 ADR (Adr ou dep) (Adr ou dep) (Adr ou dep) Donnée_8 1101 000w 1101 001w 1100 000w 1111 001z MOD 011 ADR MOD 011 ADR MOD 011 ADR (Adr ou dep) (Adr ou dep) (Adr ou dep) Donnée_8 (Adr ou dep) (Adr ou dep) donnée Microprocesseur 8086 RET intra segment inter segment ROL R/M,1 R/M,CL R/M,im8 (*) ROR R/M,1 R/M,CL R/M,im8 (*) SAHF SAL/SHL R/M,1 R/M,CL R/M,im8 (*) SAR R/M,1 R/M,CL R/M,im8 (*) SBB R/M R R/M im AL/AX im (*) SCAS SHR R/M,1 R/M,CL R/M,im8 (*) STC STD STI STOS SUB R/M R M im (**) R im (**) AL/AX im TEST R/M R R/M im AL/AX im WAIT XCHG R/M R R AX XLAT XOR • R/M R R/M im AL/AX im 46 par A. Oumnad 1100 0011 1100 1011 1101 000w 1101 001w 1100 000w MOD 000 ADR MOD 000 ADR MOD 000 ADR (Adr ou dep) (Adr ou dep) (Adr ou dep) Donnée_8 1101 000w 1101 001w 1100 000w 1001 1110 MOD 001 ADR MOD 001 ADR MOD 001 ADR (Adr ou dep) (Adr ou dep) (Adr ou dep) Donnée_8 1101 000w 1101 001w 1100 000w MOD 100 ADR MOD 100 ADR MOD 100 ADR (Adr ou dep) (Adr ou dep) (Adr ou dep) Donnée_8 1101 000w 1101 001w 1100 000w MOD 111 ADR MOD 111 ADR MOD 111 ADR (Adr ou dep) (Adr ou dep) (Adr ou dep) Donnée_8 0001 10dw 1000 00sw 0001 110w 1010 111w MOD REG ADR MOD 011 ADR donnée (Adr ou dep) (Adr ou dep) donnée 1101 000w 1101 001w 1100 000w 1111 1001 1111 1101 1111 1011 1010 101w MOD 101 ADR MOD 101 ADR MOD 101 ADR (Adr ou dep) (Adr ou dep) (Adr ou dep) Donnée_8 0010 10dw 1000 00sw 1000 00sw 0010 110w MOD REG ADR MOD 101 ADR 11 101 REG donnée (Adr ou dep) (Adr ou dep) donnée 1000 010w 1111 011w 1010 100w 1001 1011 MOD REG ADR MOD 000 ADR donnée (Adr ou dep) (Adr ou dep) 1000 011w 10010 REG 1101 0111 0011 00dw 1000 000w 0011 010w MOD REG ADR (Adr ou dep) MOD REG ADR MOD 110 ADR donnée (Adr ou dep) (Adr ou dep) donnée donnée donnée Microprocesseur 8086 par A. Oumnad Les champs entre ( ) sont présents dans le cas de l’adressage direct [aaaa] ou de l’adressage indirect avec déplacement [R+dep] ou [Rb + Ri + dep] Un champ adresse est toujours constitué de 2 octets : AdrL AdrH Un champ de donnée peut être de 1 ou de 2 octets selon l’instruction, DL suivie éventuellement de DH (*) Ces instructions ne tournent pas sur le 8086 mais sur les processeurs qui l’on suivi (**) s=1 dans le cas R/M16 ↔ im8, une extension de signe 8 bits vers 16 bits est effectués sur la donnée immédiate avant l’opération. Exemples : mov ax , 3456h R16 ← im16 1011 w REG donnée 1011 1 000 5634 B8 56 34 mov CL , [BP+SI] R8 ← M 1000 10dw MOD REG ADR 1000 1010 00 001 010 8A 0A Mov bx , 56h R16 ← im16 1011 w REG donnée 1011 1 011 56 00 BB 56 00 Mov bl, 56h R8 ← im8 1011 w REG donnée 1011 0 011 56 B3 56 Mov DX , [123h] R16 ← M 1000 10dw MOD REG ADR adresse 1000 1011 00 010 110 2301 8B 16 23 01 Mov AX , BX R16 ← R16 1000 10dw MOD REG ADR 1000 1001 11 011 000 89 D8 Mov [SI + 146h] , BL M ← R8 1000 10dw MOD REG ADR deplong 1000 1000 10 011 100 4601 88 9C 46 01 Mov [BX+DI + 46h] , CX M ← R16 1000 10dw MOD REG ADR depcourt 1000 1001 01 001 001 46 89 49 46 mov AX , [3456h] AX ← Mdirect 1010 000w adresse 1010 0001 5634 A1 56 34 AND BL , 38h R8 ← im 1000 000w MOD 100 ADR donée 1000 0000 11 100 011 38 80 E3 38 47 Microprocesseur 8086 35 par A. Oumnad 4 LES ENTREE SORTIES Pour faire des entrées sorties (essentiellement avec l’écran et le clavier), on passe par des interruptions du BIOS ou du DOS. Nous n'allons voir ici que ce dont nous avons besoin. 4.1.1 L'interruption 10h du BIOS Le BIOS est de relativement bas niveau et dépend fortement de la machine. L'interruption 10h peut effectuer beaucoup de fonctions différentes, le numéro de la fonction désirée doit être place dans AH avant l'appel de l'interruption. Nous ne parlerons ici que de quelques fonctions. Fonction 00 Cette fonction permet de choisir un mode texte ou un mode graphique. En changeant de mode, on peut effacer l'écran, ce qui fait que l'on peut appeler cette fonction pour effacer l'écran et rester dans le même mode. Paramètres : AH = 00 AL mode 00h 01h 02h 03h 04h 05h 06h 07h 0Dh 0Eh 0Fh 10h 11h 12h 13h T T T T G G G T G G G G G G G Résolution dimensions Résolution texte caractère graphique 40x25 9x16 360x400 40x25 9x16 360x400 80x25 9x16 720x400 80x25 9x16 720x400 40x25 8x8 320x200 40x25 8x8 320x200 80x25 8x8 640x200 80x25 9x16 720x400 40x25 8x8 320x200 80x25 8x8 640x200 80x25 8x14 640x350 80x25 8x14 640x350 80x30 8x16 640x480 80x30 8x16 640x480 40x25 8x8 320x200 Couleurs 16 16 16 16 4 4 2 mono 16 16 mono 16 mono 16 256 pages Segment 8 8 8 8 . . . . 8 4 2 . . . . B800 B800 B800 B800 B800 B800 B800 B000 A000 A000 A000 A000 A000 A000 A000 Tableau 4.1 : modes écran Pour les modes texte, on peut doubler le nombre de ligne en chargeant un jeux de caractère de hauteur 8 pixels. Voir fonction 11 Pour ne pas effacer l'écran, placer le bit 7 de AL à 1 (Ajouter 80h) Fonction 09 couleur couleur Cette fonction permet d'écrire un caractère texte arrière plan - Permet les répétitions, - Gère la couleur en mode texte et en mode R V B R V B graphique, - Ne gère pas le curseur. clignotement brillance Paramètres : AH = 09h Fig. 4.1 : couleur en mode texte AL = caractère à écrire BH = page écran BL = attribut de couleur (RVB :111=Blanc, 000=Noir) Microprocesseur 8086 par A. Oumnad 36 CX = nombre de fois Les caractères spéciaux ne sont pas reconnus (le 7 ne fait pas bip). Le bit 7 de la couleur fait un ou exclusif en mode graphique et un clignotement (uniquement en mode plein écran) en mode texte. En mode graphique, l'attribut de couleur ne concerne que le caractère ou le pixel, il n'agit pas sur la couleur de l'arrière plan. Ceci est valable pour les autres fonctions qui gèrent la couleur. Fonction 0Eh Cette fonction permet d'écrire un caractère, - Fonctionne en mode graphique, - Gère le curseur - Gère la couleur seulement en mode graphique. Seule la couleur du caractère est gérée, la couleur du fond n’est pas gérée. paramètres : AH = 0Eh AL = code ascii du caractère à écrire BL = couleur du caractère (mode graphique uniquement). Les caractères spéciaux sont reconnus : - 10 (LF : Line Feed ) descend le curseur d'une ligne - 13 (CR : Carriage Return ) ramène le curseur en début de lignes - 08 (BS : Back Space ) ramène le curseur d'une position à gauche - 07 (BEL) fait bip mov ah,0Eh mov al,'A' int 10h ; affiche le caractère A à la position courante du curseur Fonction 02 Cette fonction permet de positionner le curseur où on le désire, dans la page courante ou dans une page cachée. Paramètres : AH = 02h BH = numéro de la page DH = ligne (ordonnée) DL = colonne (abscisse) En mode 25x80 les cordonnées vont de (0,0) à (24,79). Exercice 17) (affcar.asm) Programme qui place l'écran en mode texte (3) et affiche le caractère A en vert sur bleu à la position (l=4,c=10) Exercice 18) (couleurs.asm) Programme qui place l'écran en mode texte (3) et affiche les 16 premiers caractères de l'alphabet, chacun sur une line, chacun répété 40 fois et chacun avec une couleur différente sur fond noir (on commence avec la couleur 0 et on incrémente). Microprocesseur 8086 37 Fonction 05 Cette fonction permet de sélectionner la page active de l'affichage. Paramètres : par A. Oumnad AH = 05h AL = numéro de la page Fonction 11h, sous fonction 12h Cette fonction permet de charger le jeu de caractère de hauteur 8 pixels pour avoir un écran de 50 lignes. (Cette fonction doit être appelée après la fonction 00) Paramètres AX = 1112h BL = 30h (08h semble marcher aussi) Exercice 19) (diag.asm) Programme qui place l'écran en mode 50 lignes et affiche ensuite l'alphabet (A … Z) en Diagonal Fonction 0Ch : allumer un pixel AH = 0Ch BH = 0 (numéro de page) AL = couleur du pixel si bit 7 = 1 on trace en mode XOR sauf en mode 256 couleur CX = x (abscisse) DX = y (ordonnée) Exercice 20) (pixel.asm) Programme qui place l'écran en mode graphique 640x480, 16 couleur et allume le pixel de coordonnées (200,300) en jaune (14) 4.1.2 L'interruption 21h du DOS Normalement le DOS est de relativement haut niveau et ne dépend pas de la machine. Il fait souvent appel au bios qui fonctionne à un niveau plus proche de la machine. L'interruption 21h peut réaliser plusieurs fonctions différentes. Nous ne citerons ici que celles que nous utiliserons. Fonction 02 Cette fonction permet d'écrire un caractère. Le caractère est envoyé vers la sortie standard, l'écriture peut donc être redirigée dans un fichier. Paramètres : AH = 02h DL = Caractère à écrire Fonction 09 Cette fonction permet en un seul appel, d'écrire une suite de caractères. Paramètres : AH = 09h DX = Adresse de la chaîne de caractères La chaîne doit être terminée par le caractère $ Microprocesseur 8086 par A. Oumnad Remarque : Cette interruption retourne $ dans le registre AL et ceci même si la documentation officielle affirme le contraire. Donc attention, si vous avez quelque chose dans AL avant d'appeler cette interruption, ce sera perdu Exemple : (phrase.asm) ;********************************************************* ; affiche une phrase … l'aide de int21_fct09 ;********************************************************* BITS 16 ORG 0x0100 SEGMENT .data txt db 'MON PREMIER PROGRAMME NASM$' SEGMENT .text MOV AH,9 MOV DX,txt INT 21h MOV AX,4C00h int 21h ; ; ; ; fonction 9 de int21 adresse du début de la phrase écrit la phrase fin programme Remarques : Pour revenir à la ligne à la fin de la chaîne : ’Bonjour’,10,13 ,’$’ Si la chaîne contient apostrophe : ’Ecole d’ingénieurs’ ’Ecole d’,39,’ingénieurs$’ Fonction 07 Cette fonction permet de lire un caractère du clavier sans qu'il n'y ait d'écho à l'écran. Paramètre passé : AH = 07 Paramètre retourné : AL = caractère lu Les touches fonction retourne 2 caractères, d'abord un octet nul, puis le code étendu de la touche, il faut donc faire 2 appels consécutifs de la fonction 07. Exercice 21) (getchar.asm) Programme qui : - Affiche l'invité 'Veuillez taper un caractère' - Attend l'entrée d'un caractère au clavier - Affiche sur la ligne suivante 'Voici le caractère tapé ' suivi du caractère Fonction 0Bh Cette fonction permet de savoir si un caractère est disponible dans la mémoire tampon du clavier. Elle est l'équivalente de la fonction kbhit (du C) ou de Keypressed (du Pascal). Il ne faut pas oublier de vider le buffer par une lecture à l'aide de la fonction 07 ou 08, sinon on risque d'avoir des surprises à la prochaine lecture du clavier. Paramètre passé : AH = 0B Paramètre retourné : AL = 0 aucun caractère n'a été tapé AL = 255 (-1) au moins un caractère a été tapé 38 Microprocesseur 8086 39 par A. Oumnad Fonction 0Ah Permet de saisir une chaîne de caractère au clavier. La saisie s'arrête quand on tape la touche , le caractère CR (13) est mémorisé avec la chaîne Paramètres : DX : adresse du buffer (zone mémoire tampon) où seront stockés la longueur de la chaîne ainsi que la chaîne saisie [DX] : longueur max. avant d'appeler la fonction, il faut placer dans le premier octet du buffer la longueur max à ne pas dépasser, il faut compter le CR. Une fois la saisie terminée, la fonction place dans le deuxième octet du buffer le nombre de caractère effectivement saisi. La chaîne saisie est placée tous de suite derrière. On doit placer ici le nombre de caractère max à saisir, il faut compter le CR Chaîne saisie DX doit pointer ici la fonction inscrit ici le nombre de caractères effectivement lus 0Dh la fonction inscrit ici la chaîne saisie suivie de CR Tableau 4.2 : illustration de la fonction 0AH de int 21h Exercice 22) : (gets.asm) Programme qui permet de saisir une chaîne de moins de 20 caractères et l'affiche ensuite en diagonale 4.2 ACCES DIRECT A LA MEMOIRE VIDEO La mémoire vidéo est une zone mémoire qui B8000 constitue une image de l’écran. Si on écrit quelque chose dans cette mémoire, elle apparaît à l’écran. Mémoire écran En mode texte, à chaque position de l’écran, vidéo correspondent deux positions (octets) de la mémoire vidéo. Le premier octet correspond au caractère attribut caractère affiché, le deuxième correspond à son attribut de couleur. La première paire d'octets représente le caractère en haut à gauche de l'écran Pour le codage de la couleur, voir int 10h, fonction 09. La mémoire écran commence à l’adresse B8000h correspondant à l’adresse Segment:Offset = B800:0000 Si l’écran est configuré en mode 80 caractères par ligne. Chaque ligne correspond à 160 octets dans la mémoire vidéo. Pour écrire un "A" en rouge sur noir à la colonne 20 de la ligne 10, il faudra écrire ‘A’=65=41h (code ascii de A) à la position 10*160 + 20*2 = 1640 et 04 dans la position suivante. La ligne 0 débute à la position mémoire 0, la ligne 1