; 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
        
        Back to Code Snippets / Powrót do Strzępów Kodu

  






Add a comment: