ARM Unified Assembler语言语法和解析器?

时间:2013-05-29 12:37:29

标签: assembly arm grammar

是否有公共可用的ARM统一汇编语言语法或解析器,如 ARM体系结构参考手册A4.2

中所述
  
    

本文档使用ARM Unified Assembler Language(UAL)。此汇编语言语法为所有ARM和Thumb指令提供规范形式。

         

UAL描述了助记符的语法和每条指令的操作数。

  

我只是对解析助记符和每条指令的操作数的代码感兴趣。例如,如何为这些行定义语法?

ADC{S}{<c>}{<q>} {<Rd>,} <Rn>, <Rm>, <type> <Rs>
IT{<x>{<y>{<z>}}}{<q>} <firstcond>
LDC{L}<c> <coproc>, <CRd>, [<Rn>, #+/-<imm>]{!}

1 个答案:

答案 0 :(得分:4)

如果你需要基于基于示例的语法创建一个简单的解析器,没有什么比ANTLR好:

http://www.antlr.org/

ANTLR将语法规范转换为词法分析器和解析器代码。它比Lexx和Yacc更直观。下面的语法涵盖了您上面指定的部分内容,并且可以很容易地扩展到您想要的内容:

grammar armasm;

/* Rules */
program: (statement | NEWLINE) +;

statement: (ADC (reg ',')? reg ',' reg ',' reg
    | IT firstcond
    | LDC coproc ',' cpreg (',' reg ','  imm )? ('!')? ) NEWLINE;

reg: 'r' INT;
coproc: 'p' INT;
cpreg: 'cr' INT;
imm: '#' ('+' | '-')? INT;
firstcond: '?';

/* Tokens */
ADC: 'ADC' ('S')? ; 
IT:   'IT';
LDC:  'LDC' ('L')?;

INT: [0-9]+;
NEWLINE: '\r'? '\n';
WS: [ \t]+ -> skip;

从ANTLR网站(OSX说明):

$ cd /usr/local/lib
$ wget http://antlr4.org/download/antlr-4.0-complete.jar
$ export CLASSPATH=".:/usr/local/lib/antlr-4.0-complete.jar:$CLASSPATH"
$ alias antlr4='java -jar /usr/local/lib/antlr-4.0-complete.jar'
$ alias grun='java org.antlr.v4.runtime.misc.TestRig'

然后在语法文件上运行:

antlr4 armasm.g4
javac *.java
grun armasm program -tree

    ADCS r1, r2, r3
    IT ?
    LDC p3, cr2, r1, #3 
    <EOF>

这会将解析树分解为标记,规则和数据:

  

(程序(声明ADCS(reg r 1),(reg r 2),(reg r 3)\ n)(声明IT(firstcond?)\ n)(声明LDC(coproc p 3)(cpreg cr 2) )(reg r 1),(imm# - 3)!\ n))

语法还没有包括指令条件代码,也没有IT指令的细节(我按时间)。 ANTLR生成词法分析器和解析器,然后grun宏将它们包装在测试装备中,这样我就可以通过生成的代码运行文本片段。生成的API可以直接在您自己的应用程序中使用。

为了完整起见,我在网上查找了现有的语法,但没有找到。你最好的选择可能是分解gasm并提取其解析器规范,但它不会是UAL语法,如果这对你很重要,它将是GPL。如果您只需要处理一部分指令,那么这是一个很好的方法。