forked from blau_araujo/pbn
diretórios 8 e 13 de exemplos
This commit is contained in:
parent
62338a8185
commit
6fbe5f3a62
13 changed files with 820 additions and 0 deletions
107
curso/exemplos/13/.gdb_history
Normal file
107
curso/exemplos/13/.gdb_history
Normal 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
|
1
curso/exemplos/13/mensagem.txt
Normal file
1
curso/exemplos/13/mensagem.txt
Normal file
|
@ -0,0 +1 @@
|
|||
Salve, simpatia!
|
141
curso/exemplos/13/salve-pipe.asm
Normal file
141
curso/exemplos/13/salve-pipe.asm
Normal 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
|
||||
|
83
curso/exemplos/13/salve-read.asm
Normal file
83
curso/exemplos/13/salve-read.asm
Normal 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
|
58
curso/exemplos/13/salve-redir.asm
Normal file
58
curso/exemplos/13/salve-redir.asm
Normal 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
146
curso/exemplos/13/teste.asm
Normal 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
|
Loading…
Add table
Add a link
Reference in a new issue