Base e desafio para a aula 10 #15

Open
opened 2025-07-22 11:33:56 -03:00 by blau_araujo · 0 comments
Owner

Com base neste código (pint.asm):

section .bss
int_buf: resb 20    ; este é o buffer que queremos utilizar!
	
section .text
global _start
_start:

	mov rax, [rsp]	; rdi contém argc

	call print_uint64
	call print_eol

_exit:
	mov rax, 60
	xor rdi, rdi
	syscall
; ----------------------------------------------------------
print_uint64:
	; rax -> uint64 num
	mov rbx, 10		; divisor
	push 0x00		; terminador da string de dígitos
.conv_loop:
	xor rdx, rdx	; zera rdx para o resto
	div rbx 		; rax=(rax / 10) e rdx=(rax % 10)
	add dl, 0x30	; converte para dígito ASCII
	push rdx		; salva dígito na pilha

	test rax, rax
	jnz .conv_loop
.print_loop:
	cmp byte [rsp], 0 	; é o terminador?
	je .done
	
	mov rax, 1
	mov rdi, 1
	mov rsi, rsp	; último byte = primeiro dígito
	mov rdx, 1
	syscall

	add rsp, 8		; avança na pilha
	jmp .print_loop
.done:
	add rsp, 8		; "retira" terminador da pilha
	ret
; ----------------------------------------------------------
print_eol:
	push 0x0a
	mov rax, 1
	mov rdi, 1
	mov rsi, rsp
	mov rdx, 1
	syscall
	add rsp, 8
	ret

Crie uma versão de print_uint64 que utilize um buffer e um contador em vez da pilha e múltiplas chamadas da syscall write.

Com base neste código (`pint.asm`): ```asm section .bss int_buf: resb 20 ; este é o buffer que queremos utilizar! section .text global _start _start: mov rax, [rsp] ; rdi contém argc call print_uint64 call print_eol _exit: mov rax, 60 xor rdi, rdi syscall ; ---------------------------------------------------------- print_uint64: ; rax -> uint64 num mov rbx, 10 ; divisor push 0x00 ; terminador da string de dígitos .conv_loop: xor rdx, rdx ; zera rdx para o resto div rbx ; rax=(rax / 10) e rdx=(rax % 10) add dl, 0x30 ; converte para dígito ASCII push rdx ; salva dígito na pilha test rax, rax jnz .conv_loop .print_loop: cmp byte [rsp], 0 ; é o terminador? je .done mov rax, 1 mov rdi, 1 mov rsi, rsp ; último byte = primeiro dígito mov rdx, 1 syscall add rsp, 8 ; avança na pilha jmp .print_loop .done: add rsp, 8 ; "retira" terminador da pilha ret ; ---------------------------------------------------------- print_eol: push 0x0a mov rax, 1 mov rdi, 1 mov rsi, rsp mov rdx, 1 syscall add rsp, 8 ret ``` Crie uma versão de `print_uint64` que utilize um buffer e um contador em vez da pilha e múltiplas chamadas da syscall write.
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#15
No description provided.