MInha versão do jogo da adivinhação #34

Open
opened 2025-08-27 13:49:34 -03:00 by blau_araujo · 0 comments
Owner

Eu ia fazer a limpeza antes de compartilhar, mas será um ótimo exercício para vocês... 😉

Divirtam-se!


Lógica: guess.asm

%include "guess.inc"
	
; --------------------------------------------------
section .rodata
; --------------------------------------------------
msg_quit:   db EOL, YELLOW_BOLD, 'Amarelou, hein... 😜', ESC_RESET, EOL, EOL, 0
msg_title:  db BLUE_BOLD, 'JOGO DA ADIVINHAÇÃO', ESC_RESET, EOL, 0
msg_help:   db 'Digite ', PLICA, 'q', PLICA, ' para desistir...', EOL, EOL, 0
msg_guess:  db BOLD, 'Digite um número de 1 a 100: ', ESC_RESET, 0
msg_again:  db 'Jogar novamente (', PLICA, 'n', PLICA, ' sai do jogo): ', 0
msg_lower:  db YELLOW_NORM, 'Baixo demais...', ESC_RESET, EOL, 0
msg_higher: db YELLOW_NORM, 'Alto demais...', ESC_RESET, EOL, 0
err_empty:  db RED_NORM, 'Deu branco? Manda um número aí...', ESC_RESET, EOL, 0
err_number: db RED_NORM, 'Eu disse um número! (•`_´•)', ESC_RESET, EOL, 0
err_range:  db RED_NORM, 'Eu disse de 1 a 100! (•`_´•)', ESC_RESET, EOL, 0
win_ini:    db EOL, PURPLE_BOLD, 'Na mosca! Você acertou com ', 0
win_end:    db ' palpites!', ESC_RESET, EOL, 0
; --------------------------------------------------
section .data
; --------------------------------------------------
tries: dq 0x00			; uint64 tries (1)
; --------------------------------------------------
section .bss
; --------------------------------------------------
rand_numb: resq 1		; uint64 rand_numb
guess_buf: resb GUESS_BUFSIZE	; char *guess_buf
tries_buf: resq 1 		; char *tries_buf

; --------------------------------------------------
section .text
; --------------------------------------------------
global _start
_start:

; --------------------------------------------------
_game_loop:	
; --------------------------------------------------
	; clear terminal...
	call	clear_screen
	; print header...
	mov	rdi, msg_title
	call	print_str
	mov	rdi, msg_help
	call	print_str
	; get random...
	mov	rdi, 1
	mov	rsi, 100
	call	cpu_rand_in_range
	mov	[rand_numb], rax
	
; --------------------------------------------------
_guess_loop:
; --------------------------------------------------
	; print guess prompt...
	mov	rdi, msg_guess
	call	print_str
	; sys_read...
	mov	rax, SYS_READ
	mov	rdi, STDIN_FD
	mov	rsi, guess_buf
	mov	rdx, GUESS_BUFSIZE - 1
	syscall
	; flush terminal...
	push	rax
	call	ioctl_tciflush
	; remove \n...
	pop	rax
.trim_read:
	mov	rdi, guess_buf
	mov	rsi, rax
	call	trim_buffer
.check_empty:
	cmp	rax, 0
	jne	.check_quit
	mov	rdi, err_empty
	call	print_str
	jmp	_guess_loop
.check_quit:
	cmp	rax, 1
	jg	.check_numb
	mov	r8b, byte [guess_buf]
	cmp	r8b, 'q'
	je	_quit_taunt
	cmp	r8b, 'Q'
	je	_quit_taunt
.check_numb:
	mov	rdi, guess_buf
	call	is_numeric
	cmp	rax, 0
	jne	.convert_guess
	mov	rdi, err_number
	call	print_str
	jmp	_guess_loop
.convert_guess:
	mov	rdi, guess_buf
	call	guess_to_num
.check_range:
	cmp	rax, 1
	jl	.range_error
	cmp	rax, 100
	jle	.inc_tries
.range_error:
	mov	rdi, err_range
	call	print_str
	jmp	_guess_loop
.inc_tries:
	xor	rcx, rcx
	mov	rcx, qword [tries]
	inc	rcx
	mov	[tries], rcx
.compare_rand:
	cmp	rax, [rand_numb]
	je	.winner
	jl	.lower
	mov	rdi, msg_higher
	call	print_str
	jmp	_guess_loop
.lower:
	mov	rdi, msg_lower
	call	print_str
	jmp	_guess_loop
.winner:
	mov	rdi, win_ini
	call	print_str
	
	mov	rdi, qword [tries]
	mov	rsi, tries_buf
	call	tries_to_str
	mov	rdi, rax
	call	print_str

	mov	rdi, win_end
	call	print_str
.play_again:
	mov	rdi, msg_again
	call	print_str
	; read 1 byte...
	sub	rsp, 8
	mov	rax, SYS_READ
	mov	rdi, STDIN_FD
	mov	rsi, rsp
	mov	rdx, 1
	syscall
	movzx	ebx, byte [rsp]
	add	rsp, 8
	; flush terminal...
	call	ioctl_tciflush
	; yes/no?
	cmp	bl, 'n'
	je	_quit_taunt
	cmp	bl, 'N'
	je	_quit_taunt
	; reset tries and play again...
	mov	qword [tries], 0
	jmp	_game_loop
	
; --------------------------------------------------
_quit_taunt:
; --------------------------------------------------
	; print taunt...
	mov	rdi, msg_quit
	call	print_str
	; exit...
	call	exit_success


Sub-rotinas específicas: guess.inc

%include "utils.inc"

%define GUESS_BUFSIZE 5

; ----------------------------------------------------------
tries_to_str:
; ----------------------------------------------------------
; rdi <- uint64
; rsi <- endereço do buffer de destino
; rax -> endereço do buffer de destino
; ----------------------------------------------------------
	mov	r8, 1		; inicia com um dígito
	cmp	rdi, 10		; num < 10^1?
	jb	.convert
.count:
	inc	r8		; incrementa expoente
	mov	r9, 100		; r9 = 10^expoente (2)
.pow10:
	cmp	rdi, r9		; num < 10^expoente?
	jb	.convert
	imul	r9, r9, 10	; próxima potência de 10
	inc	r8		; incrementa expoente
	jmp	.pow10
.convert:
	mov	byte [rsi + r8], 0 ; terminador nulo
	mov	rax, rdi	   ; rax = num
	mov	r9, 10		   ; r9 = divisor
.conv_loop:
	dec	r8		   ; offset - 1
	xor	rdx, rdx	; rdx = resto
	div	r9		; rax = quociente
	add	dl, 0x30	; converte resto para ascii
	mov	byte [rsi + r8], dl ; armazena dígito
	cmp	rax, 0		    ; quociente = 0?
	je	.done
	jmp	.conv_loop
.done:
	mov	rax, rsi
	ret
	
	
; ----------------------------------------------------------
guess_to_num:
; ----------------------------------------------------------
; rdi <- ponteiro para string terminada em 0x00
; rax -> inteiro convertido
; ----------------------------------------------------------
	xor	rax, rax
	xor	rcx, rcx
	xor	r8, r8
.conv_loop:
	mov	r8b, byte [rdi + rcx]
	cmp	r8b, 0
	je	.done
	sub	r8b, 0x30
	imul	rax, 10
	add	rax, r8
	inc	rcx
	jmp	.conv_loop
.done:
	ret

; ----------------------------------------------------------
is_numeric:
; ----------------------------------------------------------
; rdi <- endereço do buffer (string terminada em 0x00)
; rax -> bytes lidos ou 0x00, se erro
; ----------------------------------------------------------
	xor	rcx, rcx
.next_char:
	mov	al, [rdi + rcx]  ; pega o byte atual
	cmp	al, 0x00	 ; fim da string?
	je	.done		 ; terminou sem encontrar inválido
	cmp	al, '0'
	jb	.error		 ; menor que '0' → inválido
	cmp	al, '9'
	ja	.error		 ; maior que '9' → inválido
	inc	rcx
	jmp	.next_char
.done:
	mov	rax, rcx	; bytes lidos
	ret
.error:
	xor	rax, rax	; string inválida
	ret

Sub-rotinas genéricas: utils.inc

%ifndef UTILS_INC
%define UTILS_INC

%include "utils.mac"

; ----------------------------------------------------------
clear_screen:
; ----------------------------------------------------------
; Limpa o terminal com sequência de escape...
; ----------------------------------------------------------
	mov	rax, 0x00485B1B4A325B1B
	push	rax
	mov	rax, SYS_WRITE
	mov	rdi, STDOUT_FD
	mov	rsi, rsp
	mov	rdx, 7
	syscall
	add	rsp, 8
	ret

; ----------------------------------------------------------
ioctl_tciflush:
; ----------------------------------------------------------
; Limpa dados não lidos restantes no terminal...
; ----------------------------------------------------------
	; ioctl(FD0, TCFLSH, TCIFLUSH)
	mov	rax, SYS_IOCTL
	mov	rdi, STDIN_FD
	mov	rsi, IOCTL_TCFLSH
	mov	rdx, IOCTL_TCIFLUSH
	syscall
	ret
	
; ----------------------------------------------------------
cpu_rand_in_range:
; ----------------------------------------------------------
; rdi <- range start
; rsi <- range end
; rax -> number	
; ----------------------------------------------------------
	rdtsc                   ; edx:eax = contador (64 bits)
	shl	rdx, 32
	or	rax, rdx        ; rax = tsc (64 bits)
	                        ; range = fim - inicio + 1
	mov	rcx, rsi
	sub	rcx, rdi
	inc	rcx             ; rcx = range
	                        ; rax % range
	xor     rdx, rdx        ; limpar rdx para div
	div     rcx             ; quociente em rax, resto em rdx
	                        ; random  = inicio + resto
	mov     rax, rdx
	add     rax, rdi
	ret

; ----------------------------------------------------------
print_str:
; ----------------------------------------------------------
; Imprime uma cadeia de caracteres terminada em 0x00...
; ----------------------------------------------------------
; rdi <- char *str
; ----------------------------------------------------------
	call	str_len
	mov	rdx, rax
	mov	rsi, rdi
	mov	rax, SYS_WRITE
	mov	rdi, STDOUT_FD
	syscall
	ret

; ----------------------------------------------------------
str_len:
; ----------------------------------------------------------
; Retorna quantidade de bytes da string sem o terminador...
; ----------------------------------------------------------
; rdi <- char *str (string terminada em 0x00)
; rax -> int64 len
; ----------------------------------------------------------
	xor	rax, rax
	xor	rcx, rcx
.count_loop:
	mov	al, byte [rdi + rcx]
	cmp	al, 0
	je	.done
	inc	rcx
	jmp	.count_loop
.done:
	mov	rax, rcx
	ret
	
; ----------------------------------------------------------
get_random:
; ----------------------------------------------------------
; Gera um dado número de bytes aleatórios em um buffer...
; ----------------------------------------------------------
; rdi <- void *buffer
; rsi <- uint64 buflen
; rax -> int64 bytes count/error
; ----------------------------------------------------------
	mov	rax, SYS_GETRANDOM
	mov	rdx, GRND_DEFAULT
	syscall
	ret
	
;-----------------------------------------------------------
trim_buffer:
;-----------------------------------------------------------
; Remove: espaço (0x20), tab (0x09), newline (0x0A)...
;-----------------------------------------------------------
;   rdi <- endereço do buffer
;   rsi <- tamanho do buffer
;   rax -> novo tamanho (0 se vazio)
;-----------------------------------------------------------
	xor	rdx, rdx	; índice de leitura
	xor	rcx, rcx	; índice de escrita (destino)
.trim_loop:
	cmp	rdx, rsi
	jge	.done
	mov	al, [rdi + rdx]
	cmp	al, 0x20
	je	.skip_space
	cmp	al, 0x09
	je	.skip_space
	cmp	al, 0x0a
	je	.skip_space
	mov	[rdi + rcx], al	; byte válido → compacta
	inc	rcx
.skip_space:
	inc	rdx
	jmp	.trim_loop
.done:
	mov	byte [rdi + rcx], 0	; terminador
	mov	rax, rcx		; novo tamanho
	ret

; ----------------------------------------------------------
exit_success:
; ----------------------------------------------------------
; Termina o programa com sucesso...
; ----------------------------------------------------------
	mov	rax, SYS_EXIT
	xor	rdi, rdi
	syscall
	
; ----------------------------------------------------------
exit_failure:
; ----------------------------------------------------------
; Termina o programa com erro...
; ----------------------------------------------------------
	mov	rax, SYS_EXIT
	mov	rdi, EXIT_FAILURE
	syscall

;-----------------------------------------------------------
%endif

Macros e diretivas: utils.mac

%ifndef UTILS_MAC
%define UTILS_MAC

; Linux x86-64 syscalls ------------------------------------

%define SYS_READ      0
%define SYS_WRITE     1
%define SYS_IOCTL     16
%define SYS_EXIT      60
%define SYS_GETRANDOM 318

; file descriptors -----------------------------------------

%define STDIN_FD      0
%define STDOUT_FD     1
%define STDERR_FD     2

; sys_getrandom flags --------------------------------------

%define GRND_DEFAULT  0
%define GRND_NONBLOCK 1
%define GRND_RANDOM   2

; ioctl flags ----------------------------------------------

%define IOCTL_TCFLSH   0x540b
%define IOCTL_TCIFLUSH 0

; data sizes -----------------------------------------------

%define BYTESIZ       1	
%define WORDSIZ       2
%define DWORDSIZ      4
%define QWORDSIZ      8

; new line -------------------------------------------------

%define EOL           0x0a	

; quotes ---------------------------------------------------

%define QUOTE         0x22
%define PLICA         0x27

; exit states ----------------------------------------------

%define EXIT_SUCCESS  0
%define EXIT_FAILURE  1

; escape codes ---------------------------------------------
	
%define CLEAR_SCR 0x00485B1B4A325B1B

%define ESC_RESET   `\e[0m`
%define BOLD        `\e[1m`
%define BLACK       `\e[30m`
%define RED_NORM    `\e[31m`
%define GREEN_NORM  `\e[32m`
%define YELLOW_NORM `\e[33m`
%define BLUE_NORM   `\e[34m`
%define PURPLE_NORM `\e[35m`
%define CYAN_NORM   `\e[36m`
%define LGRAY_NORM  `\e[37m`

%define DGRAY_BOLD  `\e[30;1m`
%define RED_BOLD    `\e[31;1m`
%define GREEN_BOLD  `\e[32;1m`
%define YELLOW_BOLD `\e[33;1m`
%define BLUE_BOLD   `\e[34;1m`
%define PURPLE_BOLD `\e[35;1m`
%define CYAN_BOLD   `\e[36;1m`
%define WHITE_BOLD  `\e[37;1m`

; ----------------------------------------------------------
%endif
Eu ia fazer a limpeza antes de compartilhar, mas será um ótimo exercício para vocês... 😉 Divirtam-se! --- ## Lógica: `guess.asm` ```asm %include "guess.inc" ; -------------------------------------------------- section .rodata ; -------------------------------------------------- msg_quit: db EOL, YELLOW_BOLD, 'Amarelou, hein... 😜', ESC_RESET, EOL, EOL, 0 msg_title: db BLUE_BOLD, 'JOGO DA ADIVINHAÇÃO', ESC_RESET, EOL, 0 msg_help: db 'Digite ', PLICA, 'q', PLICA, ' para desistir...', EOL, EOL, 0 msg_guess: db BOLD, 'Digite um número de 1 a 100: ', ESC_RESET, 0 msg_again: db 'Jogar novamente (', PLICA, 'n', PLICA, ' sai do jogo): ', 0 msg_lower: db YELLOW_NORM, 'Baixo demais...', ESC_RESET, EOL, 0 msg_higher: db YELLOW_NORM, 'Alto demais...', ESC_RESET, EOL, 0 err_empty: db RED_NORM, 'Deu branco? Manda um número aí...', ESC_RESET, EOL, 0 err_number: db RED_NORM, 'Eu disse um número! (•`_´•)', ESC_RESET, EOL, 0 err_range: db RED_NORM, 'Eu disse de 1 a 100! (•`_´•)', ESC_RESET, EOL, 0 win_ini: db EOL, PURPLE_BOLD, 'Na mosca! Você acertou com ', 0 win_end: db ' palpites!', ESC_RESET, EOL, 0 ; -------------------------------------------------- section .data ; -------------------------------------------------- tries: dq 0x00 ; uint64 tries (1) ; -------------------------------------------------- section .bss ; -------------------------------------------------- rand_numb: resq 1 ; uint64 rand_numb guess_buf: resb GUESS_BUFSIZE ; char *guess_buf tries_buf: resq 1 ; char *tries_buf ; -------------------------------------------------- section .text ; -------------------------------------------------- global _start _start: ; -------------------------------------------------- _game_loop: ; -------------------------------------------------- ; clear terminal... call clear_screen ; print header... mov rdi, msg_title call print_str mov rdi, msg_help call print_str ; get random... mov rdi, 1 mov rsi, 100 call cpu_rand_in_range mov [rand_numb], rax ; -------------------------------------------------- _guess_loop: ; -------------------------------------------------- ; print guess prompt... mov rdi, msg_guess call print_str ; sys_read... mov rax, SYS_READ mov rdi, STDIN_FD mov rsi, guess_buf mov rdx, GUESS_BUFSIZE - 1 syscall ; flush terminal... push rax call ioctl_tciflush ; remove \n... pop rax .trim_read: mov rdi, guess_buf mov rsi, rax call trim_buffer .check_empty: cmp rax, 0 jne .check_quit mov rdi, err_empty call print_str jmp _guess_loop .check_quit: cmp rax, 1 jg .check_numb mov r8b, byte [guess_buf] cmp r8b, 'q' je _quit_taunt cmp r8b, 'Q' je _quit_taunt .check_numb: mov rdi, guess_buf call is_numeric cmp rax, 0 jne .convert_guess mov rdi, err_number call print_str jmp _guess_loop .convert_guess: mov rdi, guess_buf call guess_to_num .check_range: cmp rax, 1 jl .range_error cmp rax, 100 jle .inc_tries .range_error: mov rdi, err_range call print_str jmp _guess_loop .inc_tries: xor rcx, rcx mov rcx, qword [tries] inc rcx mov [tries], rcx .compare_rand: cmp rax, [rand_numb] je .winner jl .lower mov rdi, msg_higher call print_str jmp _guess_loop .lower: mov rdi, msg_lower call print_str jmp _guess_loop .winner: mov rdi, win_ini call print_str mov rdi, qword [tries] mov rsi, tries_buf call tries_to_str mov rdi, rax call print_str mov rdi, win_end call print_str .play_again: mov rdi, msg_again call print_str ; read 1 byte... sub rsp, 8 mov rax, SYS_READ mov rdi, STDIN_FD mov rsi, rsp mov rdx, 1 syscall movzx ebx, byte [rsp] add rsp, 8 ; flush terminal... call ioctl_tciflush ; yes/no? cmp bl, 'n' je _quit_taunt cmp bl, 'N' je _quit_taunt ; reset tries and play again... mov qword [tries], 0 jmp _game_loop ; -------------------------------------------------- _quit_taunt: ; -------------------------------------------------- ; print taunt... mov rdi, msg_quit call print_str ; exit... call exit_success ``` ## Sub-rotinas específicas: `guess.inc` ```asm %include "utils.inc" %define GUESS_BUFSIZE 5 ; ---------------------------------------------------------- tries_to_str: ; ---------------------------------------------------------- ; rdi <- uint64 ; rsi <- endereço do buffer de destino ; rax -> endereço do buffer de destino ; ---------------------------------------------------------- mov r8, 1 ; inicia com um dígito cmp rdi, 10 ; num < 10^1? jb .convert .count: inc r8 ; incrementa expoente mov r9, 100 ; r9 = 10^expoente (2) .pow10: cmp rdi, r9 ; num < 10^expoente? jb .convert imul r9, r9, 10 ; próxima potência de 10 inc r8 ; incrementa expoente jmp .pow10 .convert: mov byte [rsi + r8], 0 ; terminador nulo mov rax, rdi ; rax = num mov r9, 10 ; r9 = divisor .conv_loop: dec r8 ; offset - 1 xor rdx, rdx ; rdx = resto div r9 ; rax = quociente add dl, 0x30 ; converte resto para ascii mov byte [rsi + r8], dl ; armazena dígito cmp rax, 0 ; quociente = 0? je .done jmp .conv_loop .done: mov rax, rsi ret ; ---------------------------------------------------------- guess_to_num: ; ---------------------------------------------------------- ; rdi <- ponteiro para string terminada em 0x00 ; rax -> inteiro convertido ; ---------------------------------------------------------- xor rax, rax xor rcx, rcx xor r8, r8 .conv_loop: mov r8b, byte [rdi + rcx] cmp r8b, 0 je .done sub r8b, 0x30 imul rax, 10 add rax, r8 inc rcx jmp .conv_loop .done: ret ; ---------------------------------------------------------- is_numeric: ; ---------------------------------------------------------- ; rdi <- endereço do buffer (string terminada em 0x00) ; rax -> bytes lidos ou 0x00, se erro ; ---------------------------------------------------------- xor rcx, rcx .next_char: mov al, [rdi + rcx] ; pega o byte atual cmp al, 0x00 ; fim da string? je .done ; terminou sem encontrar inválido cmp al, '0' jb .error ; menor que '0' → inválido cmp al, '9' ja .error ; maior que '9' → inválido inc rcx jmp .next_char .done: mov rax, rcx ; bytes lidos ret .error: xor rax, rax ; string inválida ret ``` ## Sub-rotinas genéricas: `utils.inc` ```asm %ifndef UTILS_INC %define UTILS_INC %include "utils.mac" ; ---------------------------------------------------------- clear_screen: ; ---------------------------------------------------------- ; Limpa o terminal com sequência de escape... ; ---------------------------------------------------------- mov rax, 0x00485B1B4A325B1B push rax mov rax, SYS_WRITE mov rdi, STDOUT_FD mov rsi, rsp mov rdx, 7 syscall add rsp, 8 ret ; ---------------------------------------------------------- ioctl_tciflush: ; ---------------------------------------------------------- ; Limpa dados não lidos restantes no terminal... ; ---------------------------------------------------------- ; ioctl(FD0, TCFLSH, TCIFLUSH) mov rax, SYS_IOCTL mov rdi, STDIN_FD mov rsi, IOCTL_TCFLSH mov rdx, IOCTL_TCIFLUSH syscall ret ; ---------------------------------------------------------- cpu_rand_in_range: ; ---------------------------------------------------------- ; rdi <- range start ; rsi <- range end ; rax -> number ; ---------------------------------------------------------- rdtsc ; edx:eax = contador (64 bits) shl rdx, 32 or rax, rdx ; rax = tsc (64 bits) ; range = fim - inicio + 1 mov rcx, rsi sub rcx, rdi inc rcx ; rcx = range ; rax % range xor rdx, rdx ; limpar rdx para div div rcx ; quociente em rax, resto em rdx ; random = inicio + resto mov rax, rdx add rax, rdi ret ; ---------------------------------------------------------- print_str: ; ---------------------------------------------------------- ; Imprime uma cadeia de caracteres terminada em 0x00... ; ---------------------------------------------------------- ; rdi <- char *str ; ---------------------------------------------------------- call str_len mov rdx, rax mov rsi, rdi mov rax, SYS_WRITE mov rdi, STDOUT_FD syscall ret ; ---------------------------------------------------------- str_len: ; ---------------------------------------------------------- ; Retorna quantidade de bytes da string sem o terminador... ; ---------------------------------------------------------- ; rdi <- char *str (string terminada em 0x00) ; rax -> int64 len ; ---------------------------------------------------------- xor rax, rax xor rcx, rcx .count_loop: mov al, byte [rdi + rcx] cmp al, 0 je .done inc rcx jmp .count_loop .done: mov rax, rcx ret ; ---------------------------------------------------------- get_random: ; ---------------------------------------------------------- ; Gera um dado número de bytes aleatórios em um buffer... ; ---------------------------------------------------------- ; rdi <- void *buffer ; rsi <- uint64 buflen ; rax -> int64 bytes count/error ; ---------------------------------------------------------- mov rax, SYS_GETRANDOM mov rdx, GRND_DEFAULT syscall ret ;----------------------------------------------------------- trim_buffer: ;----------------------------------------------------------- ; Remove: espaço (0x20), tab (0x09), newline (0x0A)... ;----------------------------------------------------------- ; rdi <- endereço do buffer ; rsi <- tamanho do buffer ; rax -> novo tamanho (0 se vazio) ;----------------------------------------------------------- xor rdx, rdx ; índice de leitura xor rcx, rcx ; índice de escrita (destino) .trim_loop: cmp rdx, rsi jge .done mov al, [rdi + rdx] cmp al, 0x20 je .skip_space cmp al, 0x09 je .skip_space cmp al, 0x0a je .skip_space mov [rdi + rcx], al ; byte válido → compacta inc rcx .skip_space: inc rdx jmp .trim_loop .done: mov byte [rdi + rcx], 0 ; terminador mov rax, rcx ; novo tamanho ret ; ---------------------------------------------------------- exit_success: ; ---------------------------------------------------------- ; Termina o programa com sucesso... ; ---------------------------------------------------------- mov rax, SYS_EXIT xor rdi, rdi syscall ; ---------------------------------------------------------- exit_failure: ; ---------------------------------------------------------- ; Termina o programa com erro... ; ---------------------------------------------------------- mov rax, SYS_EXIT mov rdi, EXIT_FAILURE syscall ;----------------------------------------------------------- %endif ``` ## Macros e diretivas: `utils.mac` ```asm %ifndef UTILS_MAC %define UTILS_MAC ; Linux x86-64 syscalls ------------------------------------ %define SYS_READ 0 %define SYS_WRITE 1 %define SYS_IOCTL 16 %define SYS_EXIT 60 %define SYS_GETRANDOM 318 ; file descriptors ----------------------------------------- %define STDIN_FD 0 %define STDOUT_FD 1 %define STDERR_FD 2 ; sys_getrandom flags -------------------------------------- %define GRND_DEFAULT 0 %define GRND_NONBLOCK 1 %define GRND_RANDOM 2 ; ioctl flags ---------------------------------------------- %define IOCTL_TCFLSH 0x540b %define IOCTL_TCIFLUSH 0 ; data sizes ----------------------------------------------- %define BYTESIZ 1 %define WORDSIZ 2 %define DWORDSIZ 4 %define QWORDSIZ 8 ; new line ------------------------------------------------- %define EOL 0x0a ; quotes --------------------------------------------------- %define QUOTE 0x22 %define PLICA 0x27 ; exit states ---------------------------------------------- %define EXIT_SUCCESS 0 %define EXIT_FAILURE 1 ; escape codes --------------------------------------------- %define CLEAR_SCR 0x00485B1B4A325B1B %define ESC_RESET `\e[0m` %define BOLD `\e[1m` %define BLACK `\e[30m` %define RED_NORM `\e[31m` %define GREEN_NORM `\e[32m` %define YELLOW_NORM `\e[33m` %define BLUE_NORM `\e[34m` %define PURPLE_NORM `\e[35m` %define CYAN_NORM `\e[36m` %define LGRAY_NORM `\e[37m` %define DGRAY_BOLD `\e[30;1m` %define RED_BOLD `\e[31;1m` %define GREEN_BOLD `\e[32;1m` %define YELLOW_BOLD `\e[33;1m` %define BLUE_BOLD `\e[34;1m` %define PURPLE_BOLD `\e[35;1m` %define CYAN_BOLD `\e[36;1m` %define WHITE_BOLD `\e[37;1m` ; ---------------------------------------------------------- %endif ```
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: blau_araujo/pbn#34
No description provided.