Untitled

mail@pastecode.io avatar
unknown
assembly_x86
a year ago
1.8 kB
1
Indexable
Never
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