Back to Code Snippets / Powrót do Strzępów Kodu


; nasm argv.asm -f elf -o argv.o
; ld argv.o -o argv
; ./argv ala ma kota
[bits 32]

SECTION .data
endofline: db 10

SECTION .text
GLOBAL _start

_start:

mov ecx, [esp] ; pierwsza na stosie jest ilosc
lea esi, [esp+4] ; a to pointer na pierwszy adres

cld ; clear direction flag.. ustawiamy ze instrukcje rep* maja jechac "do przodu"
mov ebx, 1 ; 1 == stdout

petla:
 push ecx ; zapisuje ecx na stosie
 
 mov edi, [esi] ; wrzucamy do edi adres argumentu
 xor al, al     ; wrzucamy 0 do al
 xor ecx, ecx   ; wrzucamy 0 do ecx
 not ecx        ; robimy ~ecx, czyli w sumie ecx = 0xffffffff
 repnz scasb    ; to jest while(*edi != '\0' && ecx > 0) edi++;
   
 mov ecx, [esi] ; wrzucamy adres pierwszego parametru do ecx
 sub edi, ecx   ; jako ze w edi jest adres ostatniego, to dlugosc = edi - ecx
 mov edx, edi   ; wrzucamy do edx dlugosc
 mov eax, 4     ; do eax 4 (sys_write)
 int 80h        ; odpalamy

 ; to zwykle putchar('\n'), nic wiecej
 lea ecx, [endofline]
 mov edx, 1
 mov eax, 4
 int 80h

 add esi, 4 ; przesuwamy esi na nastepny adres na stosie
 
 pop ecx ; sciagamy ecx ze stosu
loop petla ; if(--ecx) goto petla


; Terminate program
mov eax,1            ; 'exit' system call
mov ebx,0            ; exit with error code 0
int 80h              ; call the kernel

Add a comment:

Nick:
URL (optional):
Math captcha: 6 ∗ 6 + 1 =