assembly - ARM 统一汇编语言语法和解析器?

标签 assembly arm grammar

是否有公开可用的 ARM 统一汇编语言的语法或解析器,如 ARM 体系结构引用手册 A4.2 中所述

This document uses the ARM Unified Assembler Language (UAL). This assembly language syntax provides a canonical form for all ARM and Thumb instructions.

UAL describes the syntax for the mnemonic and the operands of each instruction.



只是我对解析助记符和每条指令的操作数的代码感兴趣。例如,您如何为这些行定义语法?
ADC{S}{<c>}{<q>} {<Rd>,} <Rn>, <Rm>, <type> <Rs>
IT{<x>{<y>{<z>}}}{<q>} <firstcond>
LDC{L}<c> <coproc>, <CRd>, [<Rn>, #+/-<imm>]{!}

最佳答案

如果您需要基于基于示例的语法创建一个简单的解析器,没有什么比 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>

这产生了分解为标记、规则和数据的解析树:

(program (statement ADCS (reg r 1) , (reg r 2) , (reg r 3) \n) (statement IT (firstcond ?) \n) (statement LDC (coproc p 3) (cpreg cr 2) (reg r 1) , (imm # - 3) ! \n))



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

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

关于assembly - ARM 统一汇编语言语法和解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16814080/

相关文章:

audio - 如何在ASM 8086中弹奏和弦?

arm - Sourcery G++(ARM 交叉编译器)安装失败

regex - 为文本编辑器定义语法的最佳方法是什么?

grammar - 如何使用antlr纯词法分析器语法定义重复固定次数的模式规则

assembly - MASM32 x86 窗口程序集 GetCommandLineToArgvW

assembly - 在汇编中清除寄存器中的位

macos - 如何在 Mojave MacOS 上安装 gcc-arm-none-eabi

grammar - Xtext 从验证器获取项目根目录

c++ - 将 GCC/ATT 风格的汇编程序转换为 visual studio 汇编程序?

linux - 尝试为 ARM 构建 GDB 时出错