Serguey Zefirov (thesz) wrote,
Serguey Zefirov
thesz

Дорвался до RSDN.

import qualified Data.Map as M

import Control.Monad.State

-- Типа, команда.
step = modify (\(a,is,labels,alllabels) -> (a+1,("s "++show a):is,labels,alllabels))

-- Типа, определить метку.
label name = modify (\(a,is,labels,alllabels) -> (a,is,upd a labels,alllabels))
    where
        upd addr labels = case M.lookup name labels of
            Just _ -> error $ "Label "++name++" redefined."
            _ -> M.insert name addr labels

-- Переход, типа. Вычисление дистанции до метки, будь то вперед или назад.
-- Ну, и симуляция инструкции.
jump name = modify (\(a,is,labels,alllabels) -> (a+1,d a alllabels:is,labels,alllabels))
    where
        d a alllabels = case M.lookup name alllabels of
            Nothing -> error $ "Undefined "++name
            Just la -> "j "++show a++" + "++show (la-a)

-- Как запустить вычисление ассемблерных команд:
prog p = let (_,is,alllabels,_) = execState p (0,[],M.empty,alllabels) in reverse is

-- Типа, программа на ассемблере:
p = do
    label "a"
    step
    step
    jump "b"
    jump "a"
    step
    step
    label "b"

-- Типа, проверка результатов вычислений смещений:
testp = prog p
Результат работы:
*Main> testp
["s 0","s 1","j 2 + 4","j 3 + -3","s 4","s 5"]
Вот меня интересует, сложно ли сделать похожий ассемблер с помощью любого императивного языка?

Товарищи с RSDN "проблем не видят." ;)
Tags: haskell, rsdn, ассемблер, языки
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 7 comments