Partage
  • Partager sur Facebook
  • Partager sur Twitter

[asm] my_put_nbr

4 novembre 2015 à 11:45:10

Bonjour,

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

  • Partager sur Facebook
  • Partager sur Twitter
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)
5 novembre 2015 à 12:01:07

Je me permets de up le sujet :(
  • Partager sur Facebook
  • Partager sur Twitter
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)
5 octobre 2020 à 12:13:29

je débute en  programmation et je veux  ecrire des fontions d'affichage :)
  • Partager sur Facebook
  • Partager sur Twitter

<audio class="audio-for-speech" />

Invalid imageright-arrow.pngInvalid image
5 octobre 2020 à 12:18:52

Bonjour,

Déterrage

Citation des règles générales du forum :

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

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter