Qu’est ce qu’on s’amuse en ASM !!!!

2 mars 2006

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 :

	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 :

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 :-)

Téléchargez le fichier code source ASM

3 commentaires pour “Qu’est ce qu’on s’amuse en ASM !!!!”

  1. #1 kinji
    2 mars 2006 à 23:37

    :D
    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)

  2. #2 PapyCli
    3 mars 2006 à 0:34

    Souvenirs souvenirs!!! Z80, 6502 et tutti quanti…
    Bref je vois que le bon esprit est toujours là!
    Je te laisse deviner???

  3. #3 Sebeuh
    3 mars 2006 à 9:55

    Je donne ma langue au chat PapyCli !!!!

    MOV WHO, "PapyCli"
    CALL WHOIS

    :-D

Ajouter un commentaire