Je debute en assembleur et je cherche à me faire une mini lib qui contiendrait des fonctions utiles Je suis en train de coder un fonction pour afficher des nombres. Le probleme que je rencontre c'est que je fait un appel systeme pour chaque digit (write). Ce que j'aimerais faire c'est allouer une chaine qui contiendrait tout les digits et afficher cette haine avec un seul write ce qui est plus optimisé pour les grands nombres. De ce que j'ai cru comprendre il faut utiliser sys_brk (0x2D) mais je ne sais pas m'en servir. Voici mon code actuel :
%include "lib/write.inc"
global my_putstr
global my_putnbr
section .texte
my_putchar:
mov eax,4
mov ebx,1
mov ecx,DWORD[esp + 4]
mov edx,1
int 0x80
ret
my_putstr:
push ebp ;on sauvegarde la stack
mov ebp,esp
push DWORD[esp + 8]
call my_strlen ;on appelle my_strlen
mov edx,eax ;on met la longueur dans edx (pour le write)
mov eax,4 ;on met 4 dans eax (designation de sys_write)
mov ebx,1 ;on met 1 dans ebx (on affiche sur la sortie standard(stdout)
pop ecx ;on met first_prompt dans ecx pour l'afficher
int 0x80 ;on appelle le kernel
leave
ret
my_putnbr:
section .data
i db 0
section .bss
digit resd 1
section .texte
push ebp ;on sauvegarde la stack
mov ebp,esp
mov eax, [esp + 8] ;on recupere le nombre à afficher
mov ebx,10 ;sert à diviser le nombre
.increment:
inc BYTE[i] ;on augmente l'incrementation
xor edx,edx ;on met edx à zero
div ebx ;on effectue la division par 10
add edx,'0' ;On passe le reste en ASCII
push edx ;on met le reste de la division sur la stack
cmp eax,0 ;On regarde si on doit continur à diviser
jnz .increment
.affichage:
pop DWORD[digit] ;on recupere le digit pour le stocker comme chaine de caractere
mov eax,digit ;on met le digit dans eax pour pouvoir le push
push eax ;on met le digit sur la stack pour l'afficher
call my_putchar ;on l'affiche
pop eax ;on l'enleve de la stack pour pouvoir afficher le suivant
dec BYTE[i] ;on decremente i
jnz .affichage ;si i n'est pas egal a zero il reste des chiffres a afficher
leave
ret
J'ai cru comprendre que dans ma partie affichage je devais faire quelque chose comme ca :
inc BYTE[i]
mov DWORD[first_pos],_end
mov ebx,DWORD[first_pos]
add ebx,DWORD[i]
mov eax,0x2d
int 0x80
dec BYTE[i]
pop ebx
push DWORD[first_pos]
call my_putstr
pop edx
leave
ret
Mais ca ne marche pas
Si quelqu'un pouvait m'aider ce serait vraiment sympathique,
Merci d'avance,
Cordialement,
PS : Je voulais aussi savoir si c'était plus optimisé de passer les arguments par la stack ou par les registres
- Edité par zzzflo 4 novembre 2015 à 12:10:36
L'erreur est toujours située entre la chaise et le clavier | Retenez bien : l'avatar de Lorrio est une marmotte (lien de J-Edward)
Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.
Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre. En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.
Au lieu de déterrer un sujet il est préférable :
soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
soit de créer un nouveau sujet décrivant votre propre contexte
ne pas répondre à un déterrage et le signaler à la modération
<audio class="audio-for-speech" />