2013-10-12 4 views
0

J'ai trouvé ici quelques sujets sur la conversion de valeur en ASCII. Mais je suis un peu coincé ici. Voici mon code:Assemblage - Convertir la valeur en ascii

;GetPID 

SECTION .data 

msg: db "Your PID is:"  ;pidmsg 
msgl: equ $-msg   ;pidlen 

lookup: db "" 

SECTION .bss 

pid: resb 8    ;test is a variable im testing to 
         ;receive the eax from sys_getpid 

SECTION .text 
     global _start 

_start: 
     call getpid   ;get pid number into eax 
     mov ebx,0xa 
     lea ebp, [pid+6] 
     call ASCIIC 
     jmp exit    ;exit 
exit: 
     mov eax,1 
     mov ebx,0 
     int 0x80 
getpid: 
     mov eax,20   ;getpid function (sys_getpid) 
     int 0x80 
     ret 
      ;ASCIIC was taken from http://theropfather.github.io/asm/getpid_tutorial.html 
ASCIIC: 
     div ebx       ;Divide the PID 
     mov byte cl, [lookup+edx]  ;Copy ASCII value to CL 
     mov [ebp], cl      ;Copy ASCII value to buffer 
     dec ebp       ;Next byte into buffer 
     xor edx, edx      ;Clear the remainder 
     inc eax       ;Dec eax tricking jnz 
     dec eax       ;Push back to original value 
     jnz ASCIIC       ;Keep looping until eax is zero 
     call .printPID      ;Print out the buffer 
     ret 

.printPID: 
    mov ecx, msg     ;message 
    mov edx, msgl     ;msg len 
    mov ebx,0x1      ;FD stdout 
    mov eax, 0x4     ;sys_write call 
    int 0x80       ;Call 
    mov [pid+7], byte 0xA   ;Push a newline to PID string 
    mov edx,0x8      ;Max length of 8 bytes 
    mov ecx,pid      ;Push PID value 
    mov ebx,0x1      ;FD stdout 
    mov eax, 0x4     ;sys_write call 
    ret 

Donc, le point est ici obtenir le numéro de pid du programme en cours (ce) et l'imprimer. Le programme appelle sys_getpid (eax = 20) et le pidnumber est renvoyé. Mais, les paramètres de sys_write est: ssize_t sys_write(unsigned int fd, const char * buf, size_t count) le deuxième argument est un char donc j'ai besoin de convertir en char pour chaque nombre.

sortie est seulement: "Votre PID:"

Toute personne? :)

+1

Avez-vous à faire cela sans utiliser une bibliothèque standard C? Sinon, utiliser 'printf' avec un spécificateur de format serait beaucoup plus facile que' sys_write' avec fd 1. – us2012

+0

Je ne veux pas utiliser C lib. Juste des interruptions et des appels système. ;) – int3

Répondre

2
  • Vous avez oublié de saisir int 0x80 une deuxième fois pour imprimer le numéro.
  • Lorsque vous div ebx, ce qui est calculé est eax = edx:eax/ebx, vous devez donc vous assurer que edx est zéro dans votre cas. Donc xor edx,edx avant vous div ebx.
  • Vous devez remplir le front de votre tampon avec des espaces, sinon vous risquez de rencontrer des problèmes en fonction de l'emplacement de la sortie standard.
  • Je suis très méfiant à propos de votre utilisation de ebp pour maintenir le pointeur sur la position actuelle du tampon. Bien que cela fonctionne ici, le pointeur de base est un registre spécial et je ne vois aucune raison d'en abuser ici.
+1

En outre, l'impression zéro octets n'est pas agréable, mais il peut arriver à travailler pour un terminal. – Jester

+0

@Jester Bon point, merci! J'ai ajouté ceci et un autre point. – us2012

+0

yup, j'ai oublié quelque chose de basique: sur .printPID j'ai oublié de faire l'interruption 0x80. :) merci: P – int3

Questions connexes