- [ORG 0x0100]
-
- [SEGMENT .data]
- decimal db '0123456789'
-
- [SEGMENT .text]
- call vga_mode
- mov eax,0xFF
- call write_eax
- call end
-
- vga_mode: ; cls sur la console
- mov al,00h
- int 10h
- ret
-
- write_eax:
- push eax ; On pousse les valeurs des registres utilisés
- push ebx ; sur la pile afin de pouvoir les restaurer
- push ecx ; après calcul.
- push edx
- push si
- mov ebx,0x0A ; Diviseur dans ebx : ici division par 10.
- xor ecx,ecx ; On met ecx à 0.
- label1:
- xor edx,edx ; On met edx à 0.
- div ebx ; Division de eax par ebx.
- ; Lors d'une division avec registres
- ; de 32 bits,le quotient est placé
- ; dans eax, le reste dans edx.
- push dx ; On pousse le reste sur la pile :
-
- inc ecx ; Incrémentation de ecx pour connaître
- ; le nombre de valeurs à récupérer sur la pile
- ; lors de l'affichage du résultat de la
- ; division en décimal
- cmp eax,ebx ; Comparaison eax avec ebx :
- jg label1 ; si > on recommence
- ; sinon, la division est terminée
- push ax ; On pousse ax contenant le premier terme du résultat.
- label2: ; boucle pour affichage
- pop si ; on récupère la valeur à afficher dans si
- add si,decimal ; on l'additionne à l'offset de la chaîne décimal
- ; pour obtenir l'offset du caractère à afficher.
- mov al,[ds:si] ; On place la valeur à afficher dans al.
- mov ah,0x0E ; fonction 0x0E interruption 10h pour affichage de al.
- int 10h
- dec ecx
- cmp ecx,0x00 ; On recommence jusqu'au second caractère.
- jne label2
- pop si ; Idem : affichage du premier caractère.
- add si,decimal
- mov al,[ds:si]
- mov ah,0x0E
- int 10h
- pop si
- pop edx ; On restaure les registres avec leur valeur initiale.
- pop ecx
- pop ebx
- pop eax
- ret
-
- end: ; Fin correcte du programme.
- mov ax,0x4C00
- int 21h
- ret
[ORG 0x0100]
[SEGMENT .data]
decimal db '0123456789'
[SEGMENT .text]
call vga_mode
mov eax,0xFF
call write_eax
call end
vga_mode: ; cls sur la console
mov al,00h
int 10h
ret
write_eax:
push eax ; On pousse les valeurs des registres utilisés
push ebx ; sur la pile afin de pouvoir les restaurer
push ecx ; après calcul.
push edx
push si
mov ebx,0x0A ; Diviseur dans ebx : ici division par 10.
xor ecx,ecx ; On met ecx à 0.
label1:
xor edx,edx ; On met edx à 0.
div ebx ; Division de eax par ebx.
; Lors d'une division avec registres
; de 32 bits,le quotient est placé
; dans eax, le reste dans edx.
push dx ; On pousse le reste sur la pile :
inc ecx ; Incrémentation de ecx pour connaître
; le nombre de valeurs à récupérer sur la pile
; lors de l'affichage du résultat de la
; division en décimal
cmp eax,ebx ; Comparaison eax avec ebx :
jg label1 ; si > on recommence
; sinon, la division est terminée
push ax ; On pousse ax contenant le premier terme du résultat.
label2: ; boucle pour affichage
pop si ; on récupère la valeur à afficher dans si
add si,decimal ; on l'additionne à l'offset de la chaîne décimal
; pour obtenir l'offset du caractère à afficher.
mov al,[ds:si] ; On place la valeur à afficher dans al.
mov ah,0x0E ; fonction 0x0E interruption 10h pour affichage de al.
int 10h
dec ecx
cmp ecx,0x00 ; On recommence jusqu'au second caractère.
jne label2
pop si ; Idem : affichage du premier caractère.
add si,decimal
mov al,[ds:si]
mov ah,0x0E
int 10h
pop si
pop edx ; On restaure les registres avec leur valeur initiale.
pop ecx
pop ebx
pop eax
ret
end: ; Fin correcte du programme.
mov ax,0x4C00
int 21h
ret