Desafios para a aula 12 #21

Open
opened 2025-07-25 22:11:48 -03:00 by blau_araujo · 1 comment
Owner
  1. Implementar uma sub-rotina para converter inteiros 64 bits com ou sem sinal.
  2. Analisar e propor melhorias nas rotinas do arquivo pbn-utils.asm.
  3. Terminar o programa para imprimir a quantidade e os argumentos recebidos pela linha de comando.
1. Implementar uma sub-rotina para converter inteiros 64 bits com ou sem sinal. 2. Analisar e propor melhorias nas rotinas do arquivo `pbn-utils.asm`. 3. Terminar o programa para imprimir a quantidade e os argumentos recebidos pela linha de comando.

Criei a subrotina i64_to_str no arquivo pbn-utils.asm:

; ----------------------------------------------------------
i64_to_str:
; ----------------------------------------------------------
; Descrição: Converte inteiro (int64) para string.
; Entradas:
;   rdi -> valor int64
;   rsi -> endereço do buffer de saída
; Saída:
;   rsi -> endereço do buffer
; Altera: rax, rcx, rdx, r8, r9
; Depende de i64_count_digits!	
; ----------------------------------------------------------
	call i64_count_digits	; retorna dígitos em rax
	mov rcx, rsi		; copia endereço inicial em rcx
	add rcx, rax		; rcx => fim da string + 1
    mov r9, rdi         ; r8 = rdi
    test r9, r9         ; verifica se inteiro é negativo
    jns .continue       ; se não for, continua
    neg rdi
    add rcx, 1          ; adiciona espaço para o sinal
.continue:
	mov byte [rcx], 0	; terminador nulo
	dec rcx			; rcx => byte anterior no buffer	
	mov rax, rdi		; copia valor para rax (dividendo)
	mov r8, 10		; r8 = 10 (divisor)
.convert_loop:
	xor rdx, rdx		; zera rdx para o resto (dígito)
	div r8			; rax = valor/10, rdx = valor%10
	add dl, 0x30		; converte resto para ASCII
	mov byte [rcx], dl	; salva caractere no buffer
	dec rcx			; endereço do byte anterior
	cmp rcx, rsi		; rsi < rcx?
	jb .end
	jmp .convert_loop
.end:
    test r9, r9         ; verifica se inteiro é negativo
    jns .done           ; se não for, retorna
    inc rcx             ; incrementa rcx
    mov byte [rcx], 0x2D    ; adiciona '-'
.done:
	ret

Meu arquivo demo.asm para testar:

%include "pbn-utils.asm"

%define BUF_SIZE 21
	
section .rodata
txt: db "abcdefghij", 0	; string com 10 caracteres + '\0'

section .bss
buf: resb BUF_SIZE	; espaço para 20 caracteres + '\0'
	
section .text
global _start
_start:
	mov rdi, buf	; endereço do buffer
	mov rsi, txt	; endereço da string
	call write_buf	; copia string e retona buffer em rsi
	call echo_str	; imprime string no endereço em rsi

_brev:
	mov rdi, buf	; endereço do buffer
	mov rsi, txt	; endereço da string
	call rev_buf	; inverte string e retorna buffer em rsi
	call echo_str	; imprime string no endereço em rsi

_pu64:
	mov rdi, 123456	; inteiro sem sinal 64 bits
	mov rsi, buf	; endereço do buffer
	call u64_to_str	; converte e retorna buffer em rsi
	call echo_str	; imprime string no endereço em rsi

_pi64pos:
    mov rdi, 456789	; inteiro com sinal 64 bits
	mov rsi, buf	; endereço do buffer
	call i64_to_str	; converte e retorna buffer em rsi
	call echo_str	; imprime string no endereço em rsi

_pi64neg:
	mov rdi, -456789	; inteiro com sinal 64 bits
	mov rsi, buf	; endereço do buffer
	call i64_to_str	; converte e retorna buffer em rsi
	call echo_str	; imprime string no endereço em rsi

_exit:
	mov rax, SYS_EXIT
	mov rdi, EXIT_OK
	syscall

Saída no terminal:

:~/pbn/Aula11 $ ./demo
abcdefghij
jihgfedcba
123456
456789
-456789
Criei a subrotina i64_to_str no arquivo pbn-utils.asm: ```asm ; ---------------------------------------------------------- i64_to_str: ; ---------------------------------------------------------- ; Descrição: Converte inteiro (int64) para string. ; Entradas: ; rdi -> valor int64 ; rsi -> endereço do buffer de saída ; Saída: ; rsi -> endereço do buffer ; Altera: rax, rcx, rdx, r8, r9 ; Depende de i64_count_digits! ; ---------------------------------------------------------- call i64_count_digits ; retorna dígitos em rax mov rcx, rsi ; copia endereço inicial em rcx add rcx, rax ; rcx => fim da string + 1 mov r9, rdi ; r8 = rdi test r9, r9 ; verifica se inteiro é negativo jns .continue ; se não for, continua neg rdi add rcx, 1 ; adiciona espaço para o sinal .continue: mov byte [rcx], 0 ; terminador nulo dec rcx ; rcx => byte anterior no buffer mov rax, rdi ; copia valor para rax (dividendo) mov r8, 10 ; r8 = 10 (divisor) .convert_loop: xor rdx, rdx ; zera rdx para o resto (dígito) div r8 ; rax = valor/10, rdx = valor%10 add dl, 0x30 ; converte resto para ASCII mov byte [rcx], dl ; salva caractere no buffer dec rcx ; endereço do byte anterior cmp rcx, rsi ; rsi < rcx? jb .end jmp .convert_loop .end: test r9, r9 ; verifica se inteiro é negativo jns .done ; se não for, retorna inc rcx ; incrementa rcx mov byte [rcx], 0x2D ; adiciona '-' .done: ret ``` Meu arquivo demo.asm para testar: ```asm %include "pbn-utils.asm" %define BUF_SIZE 21 section .rodata txt: db "abcdefghij", 0 ; string com 10 caracteres + '\0' section .bss buf: resb BUF_SIZE ; espaço para 20 caracteres + '\0' section .text global _start _start: mov rdi, buf ; endereço do buffer mov rsi, txt ; endereço da string call write_buf ; copia string e retona buffer em rsi call echo_str ; imprime string no endereço em rsi _brev: mov rdi, buf ; endereço do buffer mov rsi, txt ; endereço da string call rev_buf ; inverte string e retorna buffer em rsi call echo_str ; imprime string no endereço em rsi _pu64: mov rdi, 123456 ; inteiro sem sinal 64 bits mov rsi, buf ; endereço do buffer call u64_to_str ; converte e retorna buffer em rsi call echo_str ; imprime string no endereço em rsi _pi64pos: mov rdi, 456789 ; inteiro com sinal 64 bits mov rsi, buf ; endereço do buffer call i64_to_str ; converte e retorna buffer em rsi call echo_str ; imprime string no endereço em rsi _pi64neg: mov rdi, -456789 ; inteiro com sinal 64 bits mov rsi, buf ; endereço do buffer call i64_to_str ; converte e retorna buffer em rsi call echo_str ; imprime string no endereço em rsi _exit: mov rax, SYS_EXIT mov rdi, EXIT_OK syscall ``` Saída no terminal: ``` :~/pbn/Aula11 $ ./demo abcdefghij jihgfedcba 123456 456789 -456789 ```
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
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#21
No description provided.