Created
February 16, 2021 14:28
-
-
Save algebraic-dev/43f1656aa52e8e3790118008de4ef330 to your computer and use it in GitHub Desktop.
Site em assembly
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
section .data | |
struc sockaddr_in | |
.sin_family: resw 1 ; 2 bytes word pra family | |
.sin_port: resw 1 ; 2 bytes 1 word pra porta | |
.sin_addr: resd 1 ; 4 bytes double word pra endereço | |
.sin_zero: resb 8 ; 8 bytes em 0 | |
endstruc | |
socket_err_msg db "Deu erro no socket bobao", 10 | |
socket_err_len equ $-socket_err_msg ; Tamanho da mensagem | |
bind_err_msg db "Deu erro no bind bobao", 10 | |
bind_err_len equ $-bind_err_msg ; Tamanho da mensagem | |
listen_err_msg db "Deu erro no listen bobao", 10 | |
listen_err_len equ $-listen_err_msg ; Tamanho da mensagem | |
accept_err_msg db "Deu erro no accept bobao", 10 | |
accept_err_len equ $-accept_err_msg ; Tamanho da mensagem | |
read_err_msg db "Deu erro no read bobao", 10 | |
read_err_len equ $-read_err_msg ; Tamanho da mensagem | |
accept_msg db "Esperando conexao", 10 | |
accept_len equ $-accept_msg ; Tamanho da mensagem | |
response_payload db "HTTP/1.1 200 OK",10,"X-Powered-By: Gayress",10,"Content-Type: text/html; charset=utf-8",10,"Content-Length: 5",10,"Connection: keep-alive",10,"Keep-Alive: timeout=5",10,"",10,"Atapo" | |
response_len equ $-response_payload | |
reuse dd 1 ; | |
addr istruc sockaddr_in | |
at sockaddr_in.sin_family, dw 2 ; | |
at sockaddr_in.sin_port, dw 36895 ; 8080 | |
at sockaddr_in.sin_addr, dd 0 ; localhost | |
at sockaddr_in.sin_zero, db 0 ; 8 bytes em 0 | |
iend | |
addr_size equ $-addr ; Tamanho da mensagem | |
; 4 Bytes / 32 bits / DWORD | |
section .bss | |
server resd 1 ; INT | |
client resd 1 ; INT | |
message_buf resw 999 | |
section .text | |
global _start | |
_create_socket: | |
mov rax, 41 ; Syscall de SOCKET | |
mov rdi, 2 ; dominio AF_INET | |
mov rsi, 1 ; SOCK_STREAM para Duplex | |
mov rdx, 0 ; protocolo 0 | |
syscall | |
mov rbx, 0 ; Move 0 para rbx | |
cmp rax, rbx ; Compara RAX com 0 | |
jl _socket_err ; Jump less = JL (Pula caso for menor) para _socket_err | |
; Mover o file descriptor para uma variavel top | |
mov [server], rax | |
; Configura o socket | |
mov rax, 54 ; Syscall de set opt socket | |
mov rdi, [server] ; file descriptor | |
mov rsi, 1 ; level | |
mov rdx, 2 ; opt nome | |
mov r10, reuse ; reuse | |
mov r8, 4 ; opt_name | |
syscall | |
mov rbx, 0 ; Move 0 para rbx | |
cmp rax, rbx ; Compara RAX com 0 | |
jl _socket_err ; Jump less = JL (Pula caso for menor) para _socket_err | |
ret | |
_bind_socket: | |
mov rax, 49 ; Syscall de BIND | |
mov rdi, [server] ; dominio AF_INET | |
mov rsi, addr ;2 SOCK_STREAM para Duplex | |
mov rdx, addr_size ; protocolo 0 | |
syscall | |
mov rbx, 0 ; Move 0 para rbx | |
cmp rax, rbx ; Compara RAX com 0 | |
jnz _bind_err ; Jump less = JL (Pula caso for menor) para _socket_err | |
ret | |
_listen_socket: | |
mov rax, 50 ; Syscall de BIND | |
mov rdi, [server] ; SERVER FILE DESCRIPTOR | |
mov rsi, 2 ; 2 NO MAXIMO NA FILA | |
syscall | |
mov rbx, 0 ; Move 0 para rbx | |
cmp rax, rbx ; Compara RAX com 0 | |
jnz _listen_err ; Jump not zero = JL (Pula caso for menor) para _socket_err | |
ret | |
_accept_socket: | |
call _waiting | |
mov rax, 43 ; Syscall de ACCEPT | |
mov rdi, [server] ; SERVER FILE DESCRIPTOR | |
mov rsi, 0 ; 0 | |
mov rdx, 0 ; 0 | |
syscall | |
mov rbx, 0 ; Move 0 para rbx | |
cmp rax, rbx ; Compara RAX com 0 | |
jl _accept_err ; Jump not zero = JL (Pula caso for menor) para _socket_err | |
mov [client], rax | |
mov rax, 0 ; read | |
mov rdi, [client] | |
mov rsi, message_buf ; message_buf | |
mov rdx, 999 | |
syscall | |
mov rax, 1 ; syscall 1 = Write | |
mov rdi, [client] ; STDOUT 1 = Stdout | |
mov rsi, response_payload ; msg = 0 | |
mov rdx, response_len ; tamanho em bytes da mensagem | |
syscall | |
jmp _accept_socket | |
ret | |
_start: | |
call _create_socket | |
call _bind_socket | |
call _listen_socket | |
call _accept_socket | |
jmp _exit_sucess | |
_waiting: | |
mov rax, 1 ; syscall 1 = Write | |
mov rdi, 1 ; STDOUT 1 = Stdout | |
mov rsi, accept_msg ; msg = 0 | |
mov rdx, accept_len ; tamanho em bytes da mensagem | |
syscall ; syscall | |
ret | |
_socket_err: | |
mov rax, 1 ; syscall 1 = Write | |
mov rdi, 1 ; STDOUT 1 = Stdout | |
mov rsi, socket_err_msg ; msg = 0 | |
mov rdx, socket_err_len ; tamanho em bytes da mensagem | |
syscall ; syscall | |
jmp _exit_error ; pula pro exit de erro | |
_bind_err: | |
mov rax, 1 ; syscall 1 = Write | |
mov rdi, 1 ; STDOUT 1 = Stdout | |
mov rsi, bind_err_msg ; msg = 0 | |
mov rdx, bind_err_len ; tamanho em bytes da mensagem | |
syscall ; syscall | |
jmp _exit_error ; pula pro exit de erro | |
_read_err: | |
mov rax, 1 ; syscall 1 = Write | |
mov rdi, 1 ; STDOUT 1 = Stdout | |
mov rsi, read_err_msg ; msg = 0 | |
mov rdx, read_err_len ; tamanho em bytes da mensagem | |
syscall ; syscall | |
jmp _exit_error ; pula pro exit de erro | |
_listen_err: | |
mov rax, 1 ; syscall 1 = Write | |
mov rdi, 1 ; STDOUT 1 = Stdout | |
mov rsi, listen_err_msg ; msg = 0 | |
mov rdx, listen_err_len ; tamanho em bytes da mensagem | |
syscall ; syscall | |
jmp _exit_error ; pula pro exit de erro | |
_accept_err: | |
mov rax, 1 ; syscall 1 = Write | |
mov rdi, 1 ; STDOUT 1 = Stdout | |
mov rsi, accept_err_msg ; msg = 0 | |
mov rdx, accept_err_len ; tamanho em bytes da mensagem | |
syscall ; syscall | |
jmp _exit_error ; pula pro exit de erro | |
_exit_error: | |
mov rax, 60 ; syscall exit | |
mov rdi, 1 ; exit code 1 | |
syscall ; | |
_exit_sucess: | |
mov rax, 60 ; syscall exit | |
mov rdi, 0 ; exit code 0 | |
syscall ; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment