我需要要分析出的语法结构包括你能想到的所有语法结构,但是将这个需求化简之后你会发现,你需要研究的语法结构只有两种,一种是 if 结构,一种是 while 结构,因为 if 语句进一步转化,会转化成 if else语句,或是switch语句,while语句进一步转化可以转化成 for 循环,各种各样的循环。
汇编的跳转可没那么丰富多彩,我所说的结构体都将最终转化为汇编,那么他一定遵循着某种规律。
if 语句和 while 语句很好分析,条件跳转JMP到上面就是while,条件跳转跳到下面就是if,但是不要忘记了 if while 语句里面的条件体可以很简单,也可以很复杂,比如 if (a>1 && (b<1 ||c>2)) 这样的语句如何分析就是语法分析的难点了。
首先,将问题再次简化,我们要分析出的语法树应该是最小单元,也就是说每一个单元都是不可再分解的。比如 if (a && b),while(a || b),都可以分解成两个语句,这样的语句不是最小单元。所以我们需要分析的语句是 if (a || b) 和 while (a && b),那么 if (a || b) 和 while (a && b) 的结构图什么样?如下
【自己想象吧】
他们共同点就是 a 会 JMP到 b的下一条指令,而 b的JMP将影响到两点,第一,他是 if 语句还是 while 语句,第二,影响到他是 && 还是 || ,为什么这么说呢?b的JMP向上,他是 while 语句,那么他的JMP就是跳的循环的开始,我称之为FunStart,那么a将JMP到循环的结束,我称之为FunEnd,判断a之后直接跳出循环,为什么?因为他们的连接符是 &&;同理,b的JMP向下,他是 if 语句,那么他的JMP就是跳到 if 语句的FunStart,可以判断他们的连接符是 ||。其实这些刚开始的时候我并没注意,到最后,思考核心算法的时候才发现他的重要性。这里面有一点很重要,那就是分析出FunStart和FunEnd。
首先分析出IFGOTO语句,这是一切的原点啊!一个CMP TEST JMP 语句可以配对型成一个条件跳转,形成一个IFGOTO语句,在这个时候提取判断参数,判断哪两个数据由CMP 和 TEST 决定,判断方式由JMP语句决定(我说的JMP好像更应该说为JMC),比如>、<、==。CMP 和TEST之间有时候会夹着一些PUSH POP MOV指令之类的,这些指令都是不改变标志位的,将这些做为初始化指令,反正也不影响标志位。