mirror of
https://github.com/keystone-engine/keystone
synced 2026-06-08 15:15:30 +00:00
74f3916a53
Removed unused utility functions and renamed variables
73 lines
2.5 KiB
Haskell
73 lines
2.5 KiB
Haskell
-- Sample code for Keystone Assembler Engine
|
|
|
|
import Keystone
|
|
|
|
import qualified Data.ByteString as BS
|
|
import qualified Numeric as N (showHex)
|
|
|
|
-- Pretty-print byte string as hex
|
|
showHexBS :: BS.ByteString -> String
|
|
showHexBS =
|
|
concatMap (flip N.showHex " ") . BS.unpack
|
|
|
|
testKs :: Architecture
|
|
-> [Mode]
|
|
-> String
|
|
-> Maybe OptionValue
|
|
-> IO ()
|
|
testKs arch mode assembly maybeSyntax = do
|
|
result <- runAssembler $ do
|
|
ks <- open arch mode
|
|
case maybeSyntax of
|
|
Just syntax -> option ks OptSyntax syntax
|
|
Nothing -> return ()
|
|
(encode, count) <- assemble ks assembly Nothing
|
|
return (encode, count)
|
|
case result of
|
|
Right (encode, count) -> let size = BS.length encode in do
|
|
putStr $ assembly ++ " = "
|
|
putStrLn $ showHexBS encode
|
|
putStrLn $ "Assembled: " ++ show size ++ " bytes, " ++
|
|
show count ++ " statements\n"
|
|
Left err -> putStrLn $ "Failed with error: " ++ show err ++ " (" ++
|
|
strerror err ++ ")"
|
|
|
|
main :: IO ()
|
|
main = do
|
|
-- X86
|
|
testKs ArchX86 [Mode16] "add eax, ecx" Nothing
|
|
testKs ArchX86 [Mode32] "add eax, ecx" Nothing
|
|
testKs ArchX86 [Mode64] "add rax, rcx" Nothing
|
|
testKs ArchX86 [Mode32] "add %ecx, %eax" (Just SyntaxAtt)
|
|
testKs ArchX86 [Mode64] "add %rcx, %rax" (Just SyntaxAtt)
|
|
|
|
-- ARM
|
|
testKs ArchArm [ModeArm] "sub r1, r2, r5" Nothing
|
|
testKs ArchArm [ModeArm, ModeBigEndian] "sub r1, r2, r5" Nothing
|
|
testKs ArchArm [ModeThumb] "movs r4, #0xf0" Nothing
|
|
testKs ArchArm [ModeThumb, ModeBigEndian] "movs r4, #0xf0" Nothing
|
|
|
|
-- ARM64
|
|
testKs ArchArm64 [ModeLittleEndian] "ldr w1, [sp, #0x8]" Nothing
|
|
|
|
-- Hexagon
|
|
testKs ArchHexagon [ModeBigEndian] "v23.w=vavg(v11.w,v2.w):rnd" Nothing
|
|
|
|
-- MIPS
|
|
testKs ArchMips [ModeMips32] "and $9, $6, $7" Nothing
|
|
testKs ArchMips [ModeMips32, ModeBigEndian] "and $9, $6, $7" Nothing
|
|
testKs ArchMips [ModeMips64] "and $9, $6, $7" Nothing
|
|
testKs ArchMips [ModeMips64, ModeBigEndian] "and $9, $6, $7" Nothing
|
|
|
|
-- PowerPC
|
|
testKs ArchPpc [ModePpc32, ModeBigEndian] "add 1, 2, 3" Nothing
|
|
testKs ArchPpc [ModePpc64] "add 1, 2, 3" Nothing
|
|
testKs ArchPpc [ModePpc64, ModeBigEndian] "add 1, 2, 3" Nothing
|
|
|
|
-- SPARC
|
|
testKs ArchSparc [ModeSparc32, ModeLittleEndian] "add %g1, %g2, %g3" Nothing
|
|
testKs ArchSparc [ModeSparc32, ModeBigEndian] "add %g1, %g2, %g3" Nothing
|
|
|
|
-- SystemZ
|
|
testKs ArchSystemz [ModeBigEndian] "a %r0, 4095(%r15,%r1)" Nothing
|