Add macros
diff --git a/src/lisp/call_list.s b/src/lisp/call_list.s
new file mode 100644
index 0000000..da0c00c
--- /dev/null
+++ b/src/lisp/call_list.s
@@ -0,0 +1,57 @@
+;;; TODO: figure out if I need to do something special with the GC here.
+
+	[bits 32]
+	[global _call_list]
+	[extern length]
+	[extern elt]
+	;;; This function should call it's first argument with the arguments from
+	;;; the cons-list passed as its second argument.
+
+	;;; _call_list(function pointer, cons list)
+_call_list:
+	push ebp
+	mov ebp, esp
+
+	mov edi, [ebp + 12]						; Cons list
+	
+	push edi
+	call length								; Length of cons list in eax
+	add esp, 4
+
+	mov ecx, eax							; Store length in counter
+
+	;; Reserve space for all the stack items
+	shl eax, 2
+	sub esp, eax
+
+	mov esi, esp							; Pointer to top of stack
+
+	;; Skip all of this if there are no arguments
+	cmp ecx, 0
+	je .done
+
+.loop:
+	;; Get the previous item. At the start ecx = the length so to get the last
+	;; index we need to subtract 1
+	dec ecx
+
+	push ecx
+	push edi
+	call elt
+	add esp, 4
+	pop ecx									; This is a scratch register, remember
+
+	;; We now have the ecx-th item in eax
+	;; Remember esi is the top of the stack area reserved, so 
+	mov [esi + 4 * ecx], eax
+
+	jcxz .done
+	jmp .loop
+
+.done:
+	mov ebx, [ebp + 8]						; Function pointer
+	call ebx
+
+	mov esp, ebp
+	pop ebp
+	ret