| Serguey Zefirov ( @ 2006-08-21 19:55:00 |
| Entry tags: | haskell, 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 "проблем не видят." ;)