Exercício da Aula 16 #32

Open
opened 2025-08-06 20:40:31 -03:00 by leandrossantos · 1 comment

mycat.c

#include "catlib.h"
#include <string.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    char *use_msg = "Uso: ./mycat <nome_do_arquivo>\n";
    char *err_msg = "Erro: não foi possível abrir o arquivo\n";
    int use_len = strlen(use_msg);
    int err_len = strlen(err_msg);

    if (argc != 2) {
        die(use_len, use_msg);
    }

    int fd = open_file(argv[1]);

    if (fd < 0) {
        die(err_len, err_msg);
    }
 
    char buf[BUFSIZ];

    read_loop(fd, buf);

    close_file(fd);

    exit_ok();    
}

catlib.h

#ifndef CATLIB_H
#define CATLIB_H

// Lê e imprime as linhas do arquivo
void read_loop(unsigned int fd, char *buffer);


// Fecha o arquivo
int close_file(unsigned int fd);


// Imprime mensagem de erro e termina
void die(unsigned int size, char *msg);


// Abre o arquivo
int open_file(char *file);


// Sai com sucesso
void exit_ok(void);


// Sai com código de erro 1
void exit_error(void);

#endif

catlib.asm

%ifndef MY_CATLIB
%define MY_CATLIB
;----------------------------------------------------
%define SYS_READ    0
%define SYS_WRITE   1
%define SYS_OPEN    2
%define SYS_CLOSE   3
%define SYS_EXIT    60
;----------------------------------------------------
%define STDOUT      1
%define STDERR      2
;----------------------------------------------------
%define EXIT_OK     0
%define EXIT_ERROR  1
;----------------------------------------------------
%define BUF_SIZE    8192 
;----------------------------------------------------
%define O_RDONLY    0
;----------------------------------------------------

global read_loop
global close_file
global die
global open_file
global exit_ok
global exit_error

;----------------------------------------------------
; Lê e imprime as linhas do arquivo
;----------------------------------------------------
; rdi <- descritor de arquivos
; rsi <- endereço do buffer
;----------------------------------------------------
; Altera: rax, rcx, rdx, rdi, r11
;----------------------------------------------------
; Depende: close_file
;----------------------------------------------------
read_loop:
    ; Lendo o arquivo
    mov rax, SYS_READ       ; syscall read
    mov rdx, BUF_SIZE       ; quantidade de bytes para leitura
    syscall

    ; Verificando se chegamos ao fim do arquivo
    cmp rax, 0              ; rax <= 0?
    jle .return             ; se sim, retorna

.print_line:
    push rdi                ; salva rdi na pilha

    ; Escrevendo a leitura do arquivo na saída padrão (STDOUT)
    mov rdx, rax            ; quantidade de bytes lidos
    mov rax, SYS_WRITE      ; syscall write
    mov rdi, STDOUT         ; saída padrão
    syscall

    pop rdi                 ; restaura o valor de rdi

    jmp read_loop

.return:
    ret

;----------------------------------------------------
; Fecha o arquivo
;----------------------------------------------------
; rdi <- descritor de arquivos
;----------------------------------------------------
; Altera: rax, rcx, r11
;----------------------------------------------------
close_file:
    ; Fechando o arquivo
    mov rax, SYS_CLOSE      ; syscall close
    syscall

    ret

;----------------------------------------------------
; Imprime a mensagem de erro e sai 
;----------------------------------------------------
; rdi <- tamanho da mensagem
; rsi <- endereço da mensagem
;----------------------------------------------------
; Altera: rax, rcx, r11, rdi, 
;----------------------------------------------------
die:
    ; Mostrando mensagem de uso correto
    mov rdx, rdi            ; tamanho da mensagem
    mov rax, SYS_WRITE      ; syscall write
    mov rdi, STDERR         ; saída de erro padrão (STDERR)
    syscall

    call exit_error

    ret

;----------------------------------------------------
; Abre o arquivo 
;----------------------------------------------------
; rdi <- caminho do arquivo
;----------------------------------------------------
; rax <- descritor de arquivo retornado
;----------------------------------------------------
; Altera: rax, rcx, r11 
;----------------------------------------------------
open_file:
    ; Abrindo o arquivo (rdi já aponta para o nome do arquivo)
    mov rax, SYS_OPEN       ; syscall open
    mov rsi, O_RDONLY       ; flag somente leitura
    mov rdx, 0              ; usado apenas quando um novo arquivo é criado
    syscall

    ret

;----------------------------------------------------
; Termina com sucesso
;----------------------------------------------------
exit_ok:    
    ; Saindo com sucesso (código de término 0)
    mov rax, SYS_EXIT       ; syscall exit
    mov rdi, EXIT_OK        ; rdi = 0
    syscall

;----------------------------------------------------
; Termina com erro 
;----------------------------------------------------
exit_error:
    ; Saindo com código de erro 1
    mov rax, SYS_EXIT       ; syscall exit
    mov rdi, EXIT_ERROR     ; código de erro 1
    syscall

%endif
mycat.c ```c #include "catlib.h" #include <string.h> #include <stdio.h> int main(int argc, char **argv) { char *use_msg = "Uso: ./mycat <nome_do_arquivo>\n"; char *err_msg = "Erro: não foi possível abrir o arquivo\n"; int use_len = strlen(use_msg); int err_len = strlen(err_msg); if (argc != 2) { die(use_len, use_msg); } int fd = open_file(argv[1]); if (fd < 0) { die(err_len, err_msg); } char buf[BUFSIZ]; read_loop(fd, buf); close_file(fd); exit_ok(); } ``` catlib.h ```c #ifndef CATLIB_H #define CATLIB_H // Lê e imprime as linhas do arquivo void read_loop(unsigned int fd, char *buffer); // Fecha o arquivo int close_file(unsigned int fd); // Imprime mensagem de erro e termina void die(unsigned int size, char *msg); // Abre o arquivo int open_file(char *file); // Sai com sucesso void exit_ok(void); // Sai com código de erro 1 void exit_error(void); #endif ``` catlib.asm ```asm %ifndef MY_CATLIB %define MY_CATLIB ;---------------------------------------------------- %define SYS_READ 0 %define SYS_WRITE 1 %define SYS_OPEN 2 %define SYS_CLOSE 3 %define SYS_EXIT 60 ;---------------------------------------------------- %define STDOUT 1 %define STDERR 2 ;---------------------------------------------------- %define EXIT_OK 0 %define EXIT_ERROR 1 ;---------------------------------------------------- %define BUF_SIZE 8192 ;---------------------------------------------------- %define O_RDONLY 0 ;---------------------------------------------------- global read_loop global close_file global die global open_file global exit_ok global exit_error ;---------------------------------------------------- ; Lê e imprime as linhas do arquivo ;---------------------------------------------------- ; rdi <- descritor de arquivos ; rsi <- endereço do buffer ;---------------------------------------------------- ; Altera: rax, rcx, rdx, rdi, r11 ;---------------------------------------------------- ; Depende: close_file ;---------------------------------------------------- read_loop: ; Lendo o arquivo mov rax, SYS_READ ; syscall read mov rdx, BUF_SIZE ; quantidade de bytes para leitura syscall ; Verificando se chegamos ao fim do arquivo cmp rax, 0 ; rax <= 0? jle .return ; se sim, retorna .print_line: push rdi ; salva rdi na pilha ; Escrevendo a leitura do arquivo na saída padrão (STDOUT) mov rdx, rax ; quantidade de bytes lidos mov rax, SYS_WRITE ; syscall write mov rdi, STDOUT ; saída padrão syscall pop rdi ; restaura o valor de rdi jmp read_loop .return: ret ;---------------------------------------------------- ; Fecha o arquivo ;---------------------------------------------------- ; rdi <- descritor de arquivos ;---------------------------------------------------- ; Altera: rax, rcx, r11 ;---------------------------------------------------- close_file: ; Fechando o arquivo mov rax, SYS_CLOSE ; syscall close syscall ret ;---------------------------------------------------- ; Imprime a mensagem de erro e sai ;---------------------------------------------------- ; rdi <- tamanho da mensagem ; rsi <- endereço da mensagem ;---------------------------------------------------- ; Altera: rax, rcx, r11, rdi, ;---------------------------------------------------- die: ; Mostrando mensagem de uso correto mov rdx, rdi ; tamanho da mensagem mov rax, SYS_WRITE ; syscall write mov rdi, STDERR ; saída de erro padrão (STDERR) syscall call exit_error ret ;---------------------------------------------------- ; Abre o arquivo ;---------------------------------------------------- ; rdi <- caminho do arquivo ;---------------------------------------------------- ; rax <- descritor de arquivo retornado ;---------------------------------------------------- ; Altera: rax, rcx, r11 ;---------------------------------------------------- open_file: ; Abrindo o arquivo (rdi já aponta para o nome do arquivo) mov rax, SYS_OPEN ; syscall open mov rsi, O_RDONLY ; flag somente leitura mov rdx, 0 ; usado apenas quando um novo arquivo é criado syscall ret ;---------------------------------------------------- ; Termina com sucesso ;---------------------------------------------------- exit_ok: ; Saindo com sucesso (código de término 0) mov rax, SYS_EXIT ; syscall exit mov rdi, EXIT_OK ; rdi = 0 syscall ;---------------------------------------------------- ; Termina com erro ;---------------------------------------------------- exit_error: ; Saindo com código de erro 1 mov rax, SYS_EXIT ; syscall exit mov rdi, EXIT_ERROR ; código de erro 1 syscall %endif ```
leandrossantos changed title from Exercício da Aula 17 to Exercício da Aula 16 2025-08-06 20:45:26 -03:00

Exercícios adicionais da aula 16:

  • Soma 3 valores
  • Multiplica por 10
  • Calcula o Quadrado

aula16.asm


	global soma
	global mult10
	global quad

;Soma 3 valores
soma:

	xor rax, rax
	add eax, edi
	add eax, esi
	add eax, edx
	
	ret

;Multiplica por 10
mult10:
	mov rax, 10
	mul rdi

	ret

;Calcula o quadrado
quad:
	mov rax, rdi
	mul rdi

	ret

aula16.h


int soma(int a, int b, int c);

int mult10(int a);

int quad(int a);

aula16.c

#include "aula16.h"
#include <stdio.h>

int main(int argc, char **argv)
{
 int x = 3;
 int y = 5;
 int z = 7;
   
 printf("x + y + z = %d\n", soma(x,y,z));

 printf("y * 10 = %d\n", mult10(y));

 printf("z² = %d\n", quad(z));
 	      
 return 0;
 
}
Exercícios adicionais da aula 16: - Soma 3 valores - Multiplica por 10 - Calcula o Quadrado aula16.asm ```asm global soma global mult10 global quad ;Soma 3 valores soma: xor rax, rax add eax, edi add eax, esi add eax, edx ret ;Multiplica por 10 mult10: mov rax, 10 mul rdi ret ;Calcula o quadrado quad: mov rax, rdi mul rdi ret ``` aula16.h ```c int soma(int a, int b, int c); int mult10(int a); int quad(int a); ``` aula16.c ```c #include "aula16.h" #include <stdio.h> int main(int argc, char **argv) { int x = 3; int y = 5; int z = 7; printf("x + y + z = %d\n", soma(x,y,z)); printf("y * 10 = %d\n", mult10(y)); printf("z² = %d\n", quad(z)); return 0; } ```
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#32
No description provided.