diretórios 8 e 13 de exemplos

This commit is contained in:
Blau Araujo 2025-06-18 09:53:30 -03:00
parent 62338a8185
commit 6fbe5f3a62
13 changed files with 820 additions and 0 deletions

View file

@ -0,0 +1,107 @@
dir
l
l
b 70
r
i proc
q
b _start
r
n
x /1gx pipe_fds
x /1gx &pipe_fds
k
b 46
r
c
x /1gx &pipe_fds
n
n
k
q
b clone
r
x /1dx pipe_fds
x /1dx &pipe_fds
x /1dx &pipe_fds+8
x /1dx &pipe_fds + 8
x /1dx &(pipe_fds + 8 )
x /2dx &pipe_fds
i registers r13 r14
q
b clone
r
i registers r13 r14
q
b clone
r
i registers r13 r14
q
b clone
r
i registers r13 r14
q
b clone
r
i registers r13 r14
x /1dx &read_end
x /1dx &write_end
q
b _start.parada
r
q
b _start.parada
r
x /1dx &write_end
x /1dx &read_end
q
b _start.parada
r
k
q
b _start.parada
r
k
q
b _start.parada
r
c
q
b _start.parada
r
k
q
b _start.parada
r
c
q
b _start.parada1
b _start.parada2
r
x /1gx &read_end
x /1dx &read_end
x /1dx &write_end
x /1x &read_end
x /1dx &read_end
p read_end
p (int *)read_end
x /4bx &read_end
x /1bx &read_end
x /1bx &write_end
x /1wx &write_end
x /1wx &read_end
x /1gx &read_end
c
c
b _start.parada1
b _start.parada2
r
x /1wx &read_end
x /1wx &write_end
x /1gx &read_end
x /1wx &read_end
x /1wx &write_end
i proc
c
c
q

View file

@ -0,0 +1 @@
Salve, simpatia!

View file

@ -0,0 +1,141 @@
; ----------------------------------------------------------
; Arquivo : salve-pipe.asm
; Reproduz: echo 'Salve, simpatia!' | cat
; Montagem: nasm -f elf64 salve-pipe.asm
; Ligação : ld -o salve-pipe salve-pipe.o
; ----------------------------------------------------------
; Chamadas de sistema...
; ----------------------------------------------------------
%define SYS_WRITE 1
%define SYS_CLOSE 3
%define SYS_PIPE 22
%define SYS_DUP2 33
%define SYS_FORK 57
%define SYS_EXECVE 59
%define SYS_EXIT 60
%define SYS_WAIT 61
; ----------------------------------------------------------
; Parâmetros de SYS_WAIT...
; ----------------------------------------------------------
%define W_CHILD -1 ; filho de qualquer PID
%define W_STATUS 0 ; ignorar o estado de término (NULL)
%define W_OPTIONS 0 ; sem opções
; ----------------------------------------------------------
; Descritores de arquivos padrão...
; ----------------------------------------------------------
%define STDIN_FD 0
%define STDOUT_FD 1
; ----------------------------------------------------------
; Estados de término...
; ----------------------------------------------------------
%define EXIT_SUCCESS 0
%define EXIT_ERROR 1
; ----------------------------------------------------------
section .rodata
; ----------------------------------------------------------
; Mensagem...
msg db "Salve, simpatia!", 10
len equ $ - msg
; Argumentos de execve...
comm db "/bin/cat", 0
argv dq comm, 0
envp dq 0
; ----------------------------------------------------------
section .bss
; ----------------------------------------------------------
read_end resd 1 ; Descritor da ponta de leitura do pipe
write_end resd 1 ; Descritor da ponta de escrita do pipe
; ----------------------------------------------------------
section .text
; ----------------------------------------------------------
global _start
_start:
; pipe(int pipefd[])
; retorna: pipefd[0] => read_end; pipefd[1] => write_end
mov rax, SYS_PIPE
mov rdi, read_end ; Retorno vai avançar em write_end
syscall
.parada1: ; examinar FDs retornados!
; fork()
mov rax, SYS_FORK
syscall
test rax, rax ; rax = 0 -> processo filho
jz .filho ; pula a execução do código do pai
; ----------------------------------------------------------
; Código executado apenas no processo pai...
; ----------------------------------------------------------
.pai:
; ----------------------------------------------------------
; dup2(write_end, STDOUT)
mov rax, SYS_DUP2
mov edi, [write_end] ; FD original: write_end
mov rsi, STDOUT_FD ; novo descritor de escrita
syscall
; Fechar write_end e read_end...
call _close_all
.parada2: ;examinar /proc/<pid>/fd!
; write(STDOUT, msg, len)
mov rax, SYS_WRITE
mov rdi, STDOUT_FD
mov rsi, msg
mov rdx, len
syscall
; wait4(-1, NULL, 0)
mov rax, SYS_WAIT
mov rdi, W_CHILD
mov rsi, W_STATUS
mov rdx, W_OPTIONS
; exit(0)
mov rax, SYS_EXIT
mov rdi, EXIT_SUCCESS ; sai com sucesso se chegar aqui
syscall
; ----------------------------------------------------------
; Código executado apenas no processo filho...
; ----------------------------------------------------------
.filho:
; ----------------------------------------------------------
; dup2(read_end, STDIN)
mov rax, SYS_DUP2
mov edi, [read_end] ; descritor de leitura no pipe
mov rsi, STDIN_FD ; novo descritor de leitura
syscall
; Fechar write_end e read_end...
call _close_all
; execve("/bin/cat", ["/bin/cat", NULL], [NULL])
mov rax, SYS_EXECVE
mov rdi, comm
mov rsi, argv
mov rdx, envp
syscall
; exit(1)
mov rax, SYS_EXIT
mov rdi, EXIT_ERROR ; sai com erro se execve falhar
syscall
; ----------------------------------------------------------
; Sub de fechamento dos descritores originais do pipe...
; ----------------------------------------------------------
_close_all:
; ----------------------------------------------------------
; close(read_end)
mov rax, SYS_CLOSE
mov rdi, [read_end]
syscall
; close(write_end)
mov rax, SYS_CLOSE
mov rdi, [write_end]
syscall
ret

View file

@ -0,0 +1,83 @@
; ----------------------------------------------------------
; Chamadas de sistema
; ----------------------------------------------------------
%define SYS_READ 0
%define SYS_WRITE 1
%define SYS_EXIT 60
; ----------------------------------------------------------
; Descritores de arquivos padrão
; ----------------------------------------------------------
%define STDIN_FD 0
%define STDOUT_FD 1
; ----------------------------------------------------------
; Estados de término
; ----------------------------------------------------------
%define EXIT_SUCCESS 0
; ----------------------------------------------------------
; Constantes simbólicas
; ----------------------------------------------------------
%define BUF_SIZE 256
; ----------------------------------------------------------
section .rodata
; ----------------------------------------------------------
msg db `Salve, simpatia!\nQual é a sua graça?\n`
msg_len equ $ - msg
resp db "Falaê, "
resp_len equ $ - resp
tail db `!\n`
; ----------------------------------------------------------
section .bss
; ----------------------------------------------------------
buf resb BUF_SIZE ; Buffer de leitura
count resd 1 ; retorno de read (int)
; ----------------------------------------------------------
section .text
; ----------------------------------------------------------
global _start
_start:
; Imprime a mensagem inicial
mov rsi, msg
mov rdx, msg_len
call _print
; Aguarda os dados da entrada padrão
mov rax, SYS_READ
mov rdi, STDIN_FD
mov rsi, buf
mov rdx, BUF_SIZE
syscall
; Salva retorno da chamada (bytes lidos)
mov [count], eax
; Imprime prefixo da resposta
mov rsi, resp
mov rdx, resp_len
call _print
; Imprime resposta
mov rsi, buf
mov rdx, [count] ; total de bytes lidos
dec rdx ; desconta \n
call _print
; Imprime final da resposta
mov rsi, tail
mov rdx, 2 ; !\n = 2 bytes
call _print
; Termina o programa
mov rax, SYS_EXIT
mov rdi, EXIT_SUCCESS
syscall
; ----------------------------------------------------------
; Sub-rotinas...
; ----------------------------------------------------------
_print:
; ----------------------------------------------------------
mov rax, SYS_WRITE
mov rdi, STDOUT_FD
syscall
ret

View file

@ -0,0 +1,58 @@
; Chamadas de sistema...
%define SYS_WRITE 1
%define SYS_OPEN 2
%define SYS_CLOSE 3
%define SYS_DUP2 33
%define SYS_EXIT 60
; Flags da chamada SYS_OPEN...
%define O_WRONLY 0x1 ; apenas para escrita
%define O_CREAT 0x40 ; cria se não existir
%define O_TRUNC 0x200 ; trunca conteúdo existente
; Permissões do arquivo criado...
%define F_MODE 0o644
; Descritores de arquivos...
%define STDOUT 1
section .rodata
file db "mensagem.txt", 0 ; arquivo de destino
msg db "Salve, simpatia!", 10 ; Mensagem
len equ $ - msg ; Tamanho da mensagem
section .text
global _start
_start:
; open (ARQUIVO, FLAGS, MODO)
mov rax, SYS_OPEN
mov rdi, file
mov rsi, O_WRONLY | O_CREAT | O_TRUNC
mov rdx, F_MODE
syscall
mov r12, rax ; salvar descritor de arquivo retornado
; dup2(ANTIGO_FD, NOVO_FD)
mov rax, SYS_DUP2
mov rdi, r12
mov rsi, STDOUT
syscall
; write(FD, STRING, SIZE)
mov rax, SYS_WRITE
mov rdi, STDOUT
mov rsi, msg
mov rdx, len
syscall
; close(FD)
mov rax, SYS_CLOSE
mov rdi, r12
syscall
; exit(STATUS)
mov rax, SYS_EXIT
xor rdi, rdi
syscall

146
curso/exemplos/13/teste.asm Normal file
View file

@ -0,0 +1,146 @@
; Arquivo: pipe_ls_cat.asm
; Montar com: nasm -felf64 pipe_ls_cat.asm && ld -o pipe_ls_cat pipe_ls_cat.o
%define SYS_READ 0
%define SYS_WRITE 1
%define SYS_CLOSE 3
%define SYS_PIPE 22
%define SYS_DUP2 33
%define SYS_FORK 57
%define SYS_EXECVE 59
%define SYS_EXIT 60
%define SYS_WAITPID 61
%define STDIN_FD 0
%define STDOUT_FD 1
%define STDERR_FD 2
%define EXIT_SUCCESS 0
%define EXIT_FAILURE 1
section .rodata
cmd_ls db "/bin/ls", 0
arg0_ls dq cmd_ls
arg1_ls db "-l", 0
arg2_ls db "/proc/self/fd", 0
argv_ls dq arg0_ls, arg1_ls, arg2_ls, 0
cmd_cat db "/bin/cat", 0
arg0_cat dq cmd_cat
argv_cat dq arg0_cat, 0
envp_null dq 0
section .bss
pipefds resq 2 ; 2 x 8 bytes (r/w)
section .text
global _start
_start:
; Cria pipe
mov rax, SYS_PIPE
mov rdi, pipefds
syscall
mov r12, [pipefds] ; leitura (pipefds[0])
mov r13, [pipefds + 8] ; escrita (pipefds[1])
; Fork para ls
mov rax, SYS_FORK
syscall
test rax, rax
jz .ls_child
; Fork para cat
mov rax, SYS_FORK
syscall
test rax, rax
jz .cat_child
; Pai: fecha descritores do pipe
mov rax, SYS_CLOSE
mov rdi, r12
syscall
mov rax, SYS_CLOSE
mov rdi, r13
syscall
; Espera dois filhos
xor rdi, rdi
xor rsi, rsi
xor rdx, rdx
mov rax, SYS_WAITPID
syscall
xor rdi, rdi
xor rsi, rsi
xor rdx, rdx
mov rax, SYS_WAITPID
syscall
; Finaliza
mov rax, SYS_EXIT
xor rdi, rdi
syscall
; -----------------------------------------
; Processo filho: ls -l /proc/self/fd
; -----------------------------------------
.ls_child:
; Redireciona stdout → pipe[1]
mov rax, SYS_DUP2
mov rdi, r13 ; escrita
mov rsi, STDOUT_FD
syscall
; Fecha descritores
mov rax, SYS_CLOSE
mov rdi, r12
syscall
mov rax, SYS_CLOSE
mov rdi, r13
syscall
; execve("/bin/ls", ["ls", "-l", "/proc/self/fd"], NULL)
mov rax, SYS_EXECVE
mov rdi, cmd_ls
mov rsi, argv_ls
mov rdx, envp_null
syscall
; Se execve falhar
mov rax, SYS_EXIT
mov rdi, EXIT_FAILURE
syscall
; -----------------------------------------
; Processo filho: cat
; -----------------------------------------
.cat_child:
; Redireciona stdin ← pipe[0]
mov rax, SYS_DUP2
mov rdi, r12 ; leitura
mov rsi, STDIN_FD
syscall
; Fecha descritores
mov rax, SYS_CLOSE
mov rdi, r12
syscall
mov rax, SYS_CLOSE
mov rdi, r13
syscall
; execve("/bin/cat", ["cat"], NULL)
mov rax, SYS_EXECVE
mov rdi, cmd_cat
mov rsi, argv_cat
mov rdx, envp_null
syscall
; Se execve falhar
mov rax, SYS_EXIT
mov rdi, EXIT_FAILURE
syscall