1
0
操纵AST的应用程序通常不小,用汇编程序对它们进行编码几乎没有好处。您最好使用更高级的语言编写AST操作,在那里您可以更容易地编写处理树的代码。(请参阅我的个人简历,了解推动AST操作的工具)。 如果你 坚决要求 ,则关键问题是定义AST节点结构。作为一个实际问题,它应该:
(这些约束来自我们的工具所操纵的非常大的AST)。 如果您坚持使用MASM-x86,以下结构定义可能是合适的:
[您可以轻松定义MASM-x64的等效项。如果你不知道怎么做,你不应该这样做。] 我们假设有许多AST节点类型,以区分语句、运算符、操作数、标识符等。。。因此我们需要区分它们,从而区分NodeType。 基于Node,文字值包含(假设互斥情况): *没有(不需要) *子节点数,如果节点类型是列表节点 *如果节点类型用于具有小值的叶,则为文字常量 *指向文本常量的指针,如果节点类型用于具有大于32位的文本值的叶 *指向标识符字符串或符号表项的指针,如果节点类型为“identifier” “Children”槽很特殊:它本质上是指向其他AST节点的指针的动态数组。对于许多AST节点类型,子节点的数量是隐式已知的;您可以在节点类型上使用表查找,或者代码可以“知道”。对于列表节点,子节点的数量需要与文本字段指定的列表长度相匹配。 任何少于4个子节点的节点都可以容纳32个字节,并且应该相应地对齐。具有4个子级以上的节点应与缓存线对齐。 您仍然需要构建一个解析器,它必须创建节点并通过填充指针字段将它们链接在一起。 我想你会发现用AST构造构建一个解析器需要很多工作(尤其是在汇编程序中),然后你需要构建一些用树做的东西。 |
2
0
您需要设置堆栈和队列(后进先出和先入先出内存块)。 您还需要操作的优先级(BEDMAS-(^/*+-=是一个很好的开始,但快速搜索Web将为不同的操作员提供多达16个不同的优先级)。 现在循环浏览您的表达式:
完成所有参数后,获取堆栈的剩余部分并将其添加到队列的末尾。 队列现在处于反向波兰方向-value1,value2,op,因此您的示例如下
由于这是一个无效的左手运算符,它将失败,但暂时忽略它并继续。对于队列中的每个项目:
因此,在这种情况下,堆栈将:
|
Anon. · 用汇编语言解释这一行? 6 年前 |
wangt13 · 如何使用VMX暂停和恢复VM 6 年前 |
Kay · Skylake和更新的环形巴士 6 年前 |
Kadir · Intel芯片上的半精度浮点算法 6 年前 |
Some_Dude · x86汇编牛顿平方根算法寄存器为1#IND 6 年前 |