Last active
December 19, 2015 08:09
-
-
Save bamorim/5923250 to your computer and use it in GitHub Desktop.
This file contains 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
%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 |
This file contains 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
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 $@ |
This file contains 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
_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