如何使用《 ARM XML机器可读体系结构规范》进行组装和反汇编?

时间:2018-09-19 08:42:32

标签: arm

ARM已发布机器可读的体系结构规范,如https://alastairreid.github.io/ARM-v8a-xml-release/

所述

是否已经有一种使用该规范来汇编和反汇编ARM代码的方法,如果可以,如何通过一个最小的示例使用它?

https://alastairreid.github.io/bidirectional-assemblers/处有一些提示,但是我找不到有效的实现。

我知道我可以使用现有的GNU工具进行组装和拆卸,但是使用该规范将:

  • 随着规范的变更,总是领先于GNU工具
  • 更有可能是正确的

1 个答案:

答案 0 :(得分:0)

这是Haskell的实现:https://github.com/nspin/hs-arm

我还没有测试过,但是自述文件声称:

import Harm
import Harm.Extra
import Control.Monad

main :: IO ()
main = do
    (start, words) <- elfText "../test/nix-results/test.busybox/busybox"
    forM_ (zip [start, start + 4..] words) $ \(offset, word) ->
        putStrLn $ hex offset ++ "  " ++ hex word ++ "  " ++
            case decode word of
                Nothing -> ".inst  " ++ hex word
                Just insn -> padRight 30 (showAsmCol 7 insn) ++ encodingId insn 

产生类似的东西:

0000000000400200  d11843ff  sub    sp, sp, #0x610         SUB_64_addsub_imm
0000000000400204  7100041f  subs   wzr, w0, #0x001        SUBS_32S_addsub_imm
0000000000400208  1a9fd7e0  csinc  w0, wzr, wzr, le       CSINC_32_condsel
000000000040020c  6a00003f  ands   wzr, w1, w0            ANDS_32_log_shift
0000000000400210  a9bd7bfd  stp    r29, r30, [sp, #-48]!  STP_64_ldstpair_pre
0000000000400214  910003fd  add    x29, sp, #0x000        ADD_64_addsub_imm
0000000000400218  a90153f3  stp    r19, r20, [sp, #16]    STP_64_ldstpair_off
000000000040021c  d0000c73  adrp   r19, 0x00018e          ADRP_only_pcreladdr
0000000000400220  91358263  add    x3, x19, #0xd60        ADD_64_addsub_imm
0000000000400224  f9400064  ldr    r4, [x3]               LDR_64_ldst_pos
...