; 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: