Exemplos do vídeo 12 #25

Open
opened 2025-07-28 07:21:42 -03:00 by blau_araujo · 0 comments
Owner

Códigos utilizados no vídeo da aula 12...

Arquivo da introdução (testes.asm)

section .bss
	buf resb 20

section .text
global _start
_start:
	; --------------------------------------------------
	; div r64 ─┬─▶ rdx:rax / r64 => quociente
	;          └─────▶ rdx % r64 => resto
	; --------------------------------------------------
	; buf -> |31|32|33|xx|xx|xx|...
	;        0  1  2  3  4  5  6...
	; --------------------------------------------------
	
	mov rax, 123
	
_count_digits:
	; --------------------------------------------------
	; 123 = 1×10^2 + 2×10^1 + 3×10^0
	; --------------------------------------------------
	mov r8, 1		; contador inicia com 1 dígito
	cmp rax, 10		; número < 10^1?
	jb .done		; se >= 10, faz contagem
.count:
	inc r8			; incrementa contagem (2)
	mov r9, 100		; r9 = 10^2(r8)
.pow10:
	cmp rax, r9		; número < 10^r8
	jb .done
	imul r9, r9, 10		; r9 = r9 * 10
	inc r8
	jmp .pow10
.done:

	; rax ainda contém o número a ser convertido...
	; r8 contém a quantidade de dígitos...
	
_int_to_str:
	; --------------------------------------------------
	; 123 / 10 => 12 resto 3 + 0x30 = 0x33
	;  12 / 10 =>  1 resto 2 + 0x30 = 0x32
	;   1 / 10 =>  0 resto 1 + 0x30 = 0x31
	; --------------------------------------------------
	mov rcx, r8		; rcx(offset) = r8(qtd de dígitos)
	mov byte [buf+rcx], 0	; terminador da string ('\0')
	dec rcx			; decrementa o offset
	mov rbx, 10		; rbx => divisor
.conv_loop:
	xor rdx, rdx		; zera rdx para receber o resto
	div rbx			; rax=rax/rbx, rdx=rax%rbx
	add dl, 0x30		; converte byte em dígito ASCII
	mov byte [buf+rcx], dl	; armazena dígito no buffer
	cmp rax, 0		; o quociente (rax) é zero?
	je .done		; se for, termina
	dec rcx			; decrementa o offset
	jmp .conv_loop
.done:

	; r8 ainda contém a quantidade de dígitos...
	
_print_str:
	mov rax, 1		; syscall write
	mov rdi, 1		; stdout (fd 1)
	mov rsi, buf		; endereço do primeiro byte
	mov rdx, r8		; qtd de bytes a imprimir
	syscall

_print_eol:
	push 0x0a		; salva '\n' na pilha
	mov rax, 1		; syscall write
	mov rdi, 1		; stdout (fd 1)
	mov rsi, rsp		; endereço de '\n' na pilha
	mov rdx, 1		; imprimir 1 byte
	syscall
	add rsp, 8		; restaura ponteiro da pilha

_exit:
	mov rax, 60
	xor rdi, rdi
	syscall
Códigos utilizados no vídeo da aula 12... ## Arquivo da introdução (`testes.asm`) ```asm section .bss buf resb 20 section .text global _start _start: ; -------------------------------------------------- ; div r64 ─┬─▶ rdx:rax / r64 => quociente ; └─────▶ rdx % r64 => resto ; -------------------------------------------------- ; buf -> |31|32|33|xx|xx|xx|... ; 0 1 2 3 4 5 6... ; -------------------------------------------------- mov rax, 123 _count_digits: ; -------------------------------------------------- ; 123 = 1×10^2 + 2×10^1 + 3×10^0 ; -------------------------------------------------- mov r8, 1 ; contador inicia com 1 dígito cmp rax, 10 ; número < 10^1? jb .done ; se >= 10, faz contagem .count: inc r8 ; incrementa contagem (2) mov r9, 100 ; r9 = 10^2(r8) .pow10: cmp rax, r9 ; número < 10^r8 jb .done imul r9, r9, 10 ; r9 = r9 * 10 inc r8 jmp .pow10 .done: ; rax ainda contém o número a ser convertido... ; r8 contém a quantidade de dígitos... _int_to_str: ; -------------------------------------------------- ; 123 / 10 => 12 resto 3 + 0x30 = 0x33 ; 12 / 10 => 1 resto 2 + 0x30 = 0x32 ; 1 / 10 => 0 resto 1 + 0x30 = 0x31 ; -------------------------------------------------- mov rcx, r8 ; rcx(offset) = r8(qtd de dígitos) mov byte [buf+rcx], 0 ; terminador da string ('\0') dec rcx ; decrementa o offset mov rbx, 10 ; rbx => divisor .conv_loop: xor rdx, rdx ; zera rdx para receber o resto div rbx ; rax=rax/rbx, rdx=rax%rbx add dl, 0x30 ; converte byte em dígito ASCII mov byte [buf+rcx], dl ; armazena dígito no buffer cmp rax, 0 ; o quociente (rax) é zero? je .done ; se for, termina dec rcx ; decrementa o offset jmp .conv_loop .done: ; r8 ainda contém a quantidade de dígitos... _print_str: mov rax, 1 ; syscall write mov rdi, 1 ; stdout (fd 1) mov rsi, buf ; endereço do primeiro byte mov rdx, r8 ; qtd de bytes a imprimir syscall _print_eol: push 0x0a ; salva '\n' na pilha mov rax, 1 ; syscall write mov rdi, 1 ; stdout (fd 1) mov rsi, rsp ; endereço de '\n' na pilha mov rdx, 1 ; imprimir 1 byte syscall add rsp, 8 ; restaura ponteiro da pilha _exit: mov rax, 60 xor rdi, rdi syscall ```
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#25
No description provided.