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
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