Skip to content

Instantly share code, notes, and snippets.

@bamorim
Last active December 19, 2015 08:09
Show Gist options
  • Save bamorim/5923250 to your computer and use it in GitHub Desktop.
Save bamorim/5923250 to your computer and use it in GitHub Desktop.
%include "sum.inc"
section .data
str: db 2
section .text
global _start
_start:
push 2
push 3
call _sum
add esp, 8 ; "remove" o 2 e o 3 da pilha (apenas avança com o ponteiro)
add eax, '0' ; Add character 0 to prepare return to print
mov [str], eax ; Set character to print
mov [str+1], byte 0Ah ; Set new line char
; Essa parte é lógica do kernel linux, se você usa windows
; Isso não vai funcionar
; Essa primeira parte define a função sys_print (eax : code 4)
; Para o arquivo stdout (ebx : id 1)
; Para imprimir desde o endereço de str
; Até 2 bytes a frente.
mov eax, 4
mov ebx, 1
mov ecx, str
mov edx, 2
int 80h ; Essa é a chamada que faz ao kernel
; Essa parte define a função sys_exit (eax : code 1)
; Informando que tudo ocorreu OK (ebx : retcode 0)
mov eax, 1
mov ebx, 0
int 80h
ASM=nasm -f elf
FILTRO_OBJS=filtro.o
EXES=filtro
all: $(EXES)
filtro: $(FILTRO_OBJS)
ld $(FILTRO_OBJS) -o $@
clean:
rm *.o $(EXES)
%.o: %.asm
$(ASM) $< -o $@
_sum:
push ebp ; Salva na pilha o base pointer.
mov ebp, esp ; Substitui o bsp pelo stack pointer
; Se for guardar espaço para variáveis locais, faça um sub bsp, NBYTES
; E acesse as variáveis com bsp + NBYTES
;
; Lembre-se de restaurar o ponteiro pra stack pro valor final quando for sair
; da subrotina, a não ser que vocÊ queira retornar algumas variáveis.
;
; No caso aqui eu estou alterando o eax, caso não queira isso, de um push em cada
; registrador antes de usa-lo e de um pop em seguida (na ordem inversa)
;
; Se ao invés de alterar um registrador você quiser retornar algo na stack
; Use o endereço das variáveis de entrada
; No caso aqui é [ebp+8] e [ebp+12]
; e no caller não altere o stack pointer (ou adicione apenas 4)
mov eax, [ebp+8]
add eax, [ebp+12]
mov esp, ebp
pop ebp
ret
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment