Untitled
unknown
assembly_x86
2 years ago
1.8 kB
4
Indexable
section .data znaki db 'To jest nowa wiadomosc', 0 nowalinia db 0x0A section .bss dlugosc resq 1 section .text global _start _start: ; pierwszy krok obliczenie dlugosci znakow mov rbx, znaki ; znaki to adres do tekstu z section .data, wrzucam adres do rejestru rbx mov rax, rbx ; wrzucam ten sam adres do rejestru rax ; zarowno rax jak i rbx wskazuja na ten sam adres ; ale tylko rax bedzie inkrementowany nextchar: cmp byte [rax], 0 ; compare, jesli rax jest null, to ustaw flage ZF jz before_loop ; jesli flaga ZF zostala ustawiona to skocz do etykiety before_loop inc rax ; inkrementuj rax jmp nextchar ; w razie nie spelnienia powyzszych warunkow, skocz ponowinie na poczatek etykiety nextchar before_loop: sub rax, rbx ; oblicz dlugosc tekstu mov qword [dlugosc], rax ; do [dlugosc], wrzuc wynik odejmowania, dlugosc tekstu mov r8, [dlugosc] ; wrzucam wynik do rejestru r8 (tylko x86_64) mov r9, znaki ; znaki do wypisania na ekranie wrzucam w rejestr r9 mov rcx, r8 ; przekazuje dlugosc z r8 do rcx - rejestr licznika print: ; wykonanie sys_write cmp byte [r9], 0 ; porownujemy 1 bajt z [r9] czy jest null jz finish mov rax, 1 ; Numer operacji systemowej (write) mov rdx, 1 ; Liczba bajtów do wypisania (1 znak) mov rsi, r9 ; Adres znaku do wypisania mov rdi, 1 ; wystarczy jeden znak syscall mov rax, 1 ; Numer operacji systemowej (write) mov rdx, 1 ; Liczba bajtów do wypisania (1 znak) mov rsi, nowalinia ; Adres znaku nowej linii mov rdi, 1 syscall inc r9 ; inkrementacja adresu wskaznika na znak jmp print ; wykonuje petle do konca rcx finish: mov rax, 60 ; Numer operacji systemowej (exit) xor rdi, rdi ; Kod powrotu (0) syscall
Editor is loading...