packages feed

calc-0.1: Asm.hs

module Asm where
import Harpy.X86CodeGen
import Harpy.X86Assembler
import Foreign

-- epilogue/prologue stuff
gfunc x = gprologue >> x >> gepilogue

gprologue = do
  push ebp
  mov ebp esp

gepilogue = do
  pop eax
  mov esp ebp
  pop ebp
  ret

-- actual operations to be done

-- because all of these end up
-- pushing the result to the stack
-- at the very end, our gepilogue
-- will pop whatever's there and mov
-- into eax
gadd = do
  pop ebx
  pop eax
  add eax ebx
  push eax

gsub = do
  pop ebx
  pop eax
  sub eax ebx
  push eax

gmul = do
  pop ebx
  pop eax
  imul InPlace eax ebx
  push eax

gdivmod = do
  pop ebx
  pop eax
  mov edx eax
  sar edx (31 :: Word8)
  idiv ebx

gdiv = do
  gdivmod
  push eax

gconst n = do
  push (fromIntegral n :: Word32)