diff --git a/asm/get_sp.asm b/asm/get_sp.asm new file mode 100644 --- /dev/null +++ b/asm/get_sp.asm @@ -0,0 +1,51 @@ +;; +;; $ID$ +;; $Source: /development/c/asm/get_sp.asm,v $ +;; +;; + +%include "asm/tools.inc" + +segment .data +label1 db "NASM Powered...", 10, 0 +reg_format db "EAX=%08x EBX=%08x ECX=%08x EDX=%08x", 10, 0 +st_format db "EBP=%08x ESP=%08x ESI=%08x EDI=%08x", 10, 10, 0 +trace_fmt db "[EBP-20] = %08x", 10, \ + "[EBP-16] = %08x", 10, "[EBP-12] = %08x", 10, \ + "[EBP- 8] = %08x", 10, "[EBP- 4] = %08x", 10, \ + "[EBP+ 0] = %08x", 10, "[EBP+ 4] = %08x", 10, \ + "[EBP+ 8] = %08x", 10, "[EBP+12] = %08x", 10, \ + "[EBP+16] = %08x", 10, "[EBP+20] = %08x", 10, 10, 0 + +segment .bss + savexp resd 1 ;; uninitialized dword value + ;; currently not used + +segment .text + global get_sp + +get_sp: + enter 4,0 ;; push ebp ;; Save Base-Pointer + ;; mov ebp, esp ;; Copy Stackpointer for !!local usage!! + ;; sub esp, 4 ;; Make room for 1 DWORD + + mov [ebp-4], esp ;; Store result in !! local variable !! + + push DWORD label1 + call printf + add esp, byte 4 ;; remove label1 from stack + + call stack_trace + + call reg_info + call stack_info + + call reg_info + call stack_info + + call stack_trace + + ;; clean up + mov eax, [ebp-4] ;; return local var + leave ;; mov esp, ebp pop ebp + ret ;; return eax