La conversion héxa => décimal s'effectue par divisions successives par 10.
Prenons l'exemple de la conversion de 255 (0xFF) :
255 / 10 = 25 dans eax + 5 dans edx
25/10 = 2 dans eax + 5 dans edx.
Il faut donc afficher dans l'ordre :
- le dernier quotient (<10) : 2
- le second reste : 5
- le premier reste : 5
Il y a probablement + simple. Toute suggestion sera la bienvenue.
Rappel : compilation sous NASM : nasm -f bin file.asm -o file.exe
Source / Exemple :
[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
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.