Qu’est ce qu’on s’amuse en ASM !!!!
Dans le cadre des cours d’architecture des ordinateurs a Supinfo, je me suis amusé a faire un petit programme COM pour processeur 8086 en assembleur qui calcule la somme des termes des lignes dans une matrice !! (un truc qui sert a rien, je sais !!!)
Le principe est simple, je definie une matrice de 4×3 dans mon programme et il m’affiche le resultat pour chaque ligne !
Exemple matrice nommé tab :
1 2 3 4 | 3 4 9 14 11 2 6 4 8 7 5 1 |
Definie en ASM par :
1 | tab DW 3,4,9,14,11,2,6,4,8,7,5,1 |
Le programme nous affiche :
1 | 16 27 18 13 |
(car 3+4+9=16, 14+11+2=27, etc….)
Sans en faire tout un roman, voici le code (env. 30 lignes) :
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 | ; ============================================== org 100h ; Structure d'un .COM JMP code ; Demarrage du programme ; ======= Variable du tableau de données ======= tab DW 3,4,9,14,11,2,6,4,8,7,5,1 ; matrice de 4x3 code: ; ============= Init des registres ============= MOV AX, 0 ; AX : Somme par ligne MOV CX, 0 ; CX : Index du tableau TAB MOV DI, 0 ; DX : Compteur de ligne boucle: ; ============== Boucle principale ============= LEA BX, tab ; Chargement du tableau TAB dans BX MOV SI, CX ; Calcul de l'index dans SI ADD SI, SI ; du tableau TAB MOV DX, [BX+SI] ; Mets le tab[SI] dans DX ADD AX, DX ; Additionne AX = AX + DX INC CX ; Incremente CX pour la boucle INC DI ; Incremente DI pour le compteur de ligne CMP DI, 3 ; Si DI=3, nouvelle ligne (newline) JE newline CMP CX, 12 ; Si AX = 12, fin du programme (fin) JGE fin JMP boucle ; Retour au debut de la boucle newline: ; ================ Nouvelle ligne =============== MOV BL, 10 ; Divise AX/10 DIV BL ; AL = quotien et AH = reste ADD AL, 48 ; Char ASCII de AL (quotient) MOV BH, AH ; Sauvegarde du reste (AH) dans BH ADD BH, 48 ; Char ASCII de BH (reste) MOV AH, 0Eh ; Fonction d'affichage INT 10h ; Interruption 1OH : affichage de AL (quotient) MOV AL, BH ; Reste (BH) dans AL INT 10h ; Interruption 1OH : affichage de AL (reste) MOV AL, 10 ; AL = 10 (Saut de ligne = \n en C = char 10 + 13) INT 10h ; Affiche AL=10 MOV AL, 13 ; AL = 13 INT 10h ; Affiche AL=13 MOV DI, 0 ; Remet DI a 0 MOV AX, 0 ; Remet AX a 0 JMP boucle ; Retour au debut de la boucle fin: ; ================= Fin du programme ============== RET ; Retourne la main a l'OS |
Wahou, vive la galère ^^ Heuresement qu’ils ont inventés les langages de haut niveau, parce que voila la galère pour faire un programme relativement simple (….et sans interêt d’ailleur ^^) !
A noter aussi que mon programme ne gere que 2 octects à l’affichage (AH et AL = 8 + 8 = 16bits), ce qui fait que la valeur maximum est 99 à l’affichage, au dessus ca affiche divers caractères !!
Au passage, un grand merci a Alex C. (a.k.a EvilSnake) pour son aide au niveau de la gestion de l’affichage des resultats a l’ecran !! C’est toujours un plaisir de coder avec toi 🙂