1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| ; ---------------------------
; getpid.asm
; ---------------------------
; compile:
; nasmf -f elf getpid.asm
; ld -o getpid getpid.o
; ---------------------------
%define SYS_EXIT 1 ; void exit(int code)
%define SYS_WRITE 4 ; int write(int fd, char* str, int len)
%define SYS_GETPID 20 ; int getpid(void)
SECTION .text
global _start
_start:
; prologue
push ebp
mov ebp, esp
sub esp, 12 ; on reserve 12 octets sur la pile, ca devrait etre suffisant pour afficher un pid
; on récupère le pid
mov eax, SYS_GETPID
int 0x80
; generation de la string contenant le pid %d
mov ebx, 10 ; on set le dénominateur
mov edi, ebp ; plutot que de stocker coté esp comme ferait un push, on stocke à l'opposé de la pile, coté ebp, en remontant vers esp
; -------------------------------------------------------------------------------------------------------------------
; [ | | | | | T4 | T3 | T2 | T1 | T0 | \n | 0x00 | 0x11 ]
; -------------------------------------------------------------------------------------------------------------------
; ^ ^ ^
; esp <-- edi ebp
;
; push recule (modifie) esp <-- nous on va dans ce sens en partant de ebp, à chaque
; pop le re-avance vers ebp tour de boucle Tx on stocke un chiffre et on recule
; notre pointeur edi à l'intérieur de la stack frame
sub edi, 4 ; on se place sur le dword précédent pour pas écraser ebp
mov dword [edi], 0x11000aFF ; valeur a la gomme juste pour illustrer, à l'endroit de [edi] il y a FF, puis '\n', suivi de '\0', la fin de notre string
mov ecx, 1 ; on a deja au minimum 1 caractère à afficher: le '\n' à la fin
std ; on modifie l'indicateur de direction pour aller en sens inverse avec edi lors du stosb plus bas
_l1: ; la boucle principale
div ebx ; edx=0, eax contient le numérateur, le dénom. est toujours dans ebx => on recup quotient dans eax, et le reste dans edx
add edx, 0x30 ; on rend le reste "printable" (cf table ASCII)
xchg eax, edx ; -- <petite manip, on echange les deux registres>
stosb ; ici on profite du fait qu'on ecrit al directement dans es:[edi], et edi se décrémente tout seul (grace au flag de direction)
xchg eax, edx ; -- </fin de l'embrouille, on remet comme c'etait>
xor edx, edx ; on remet edx (partie haute du numérateur) à 0
inc ecx ; on incrémente notre compteur de lettres à afficher
test eax, eax ; est-ce que le quotient vaut 0 ?
jnz _l1
inc edi ; on pointe sur le debut de notre string juste un octet trop loin, toujours a cause du stosb
cld ; on remet l'indicateur de direction à 0
; on affiche
mov eax, SYS_WRITE
mov ebx, 1 ; STDOUT_FILENO
mov edx, edi ; la string représentant le pid
xchg ecx, edx ; on hop, on remet dans l'ordre c'est magique
int 0x80
; on passe le balais vite fait
leave
; on ferme à clé et on s'en va
mov eax, SYS_EXIT
xor ebx, ebx
int 0x80 |
Partager