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 🙂
kinji
😀
On s’amusait aussi à faire des conneries comme ça en première année quand on a vu ça, c’est marrant 5mn après c’est relou. Mais bon quand tu dois faire des trucs vraiment près de la machine, c’est le top 🙂 (Heureusement pour nous autre humain, rarement utilisés :p)
PapyCli
Souvenirs souvenirs!!! Z80, 6502 et tutti quanti…
Bref je vois que le bon esprit est toujours là!
Je te laisse deviner???
Sebeuh
Je donne ma langue au chat PapyCli !!!!
MOV WHO, "PapyCli"
CALL WHOIS
😀