代码中对循环也做出了判断,如果指针往已经运行过的地方跳转,就是循环了,循环。
同样,我们还是美观地输出一下我们的成果

这回,我们的代码已经不需要指令指针这个东西了,顺序执行即可。
这一步,我们需要把已经分块的代码,根据每一个操作指令对栈做出的操作,推算出原本的代码是什么样的。
add esp, 16
push (null)
db [esp], 'is_admin'
call (0) [esp]
not [esp]
if [esp]
pop
else
pop
push (null)
link [esp], [ebp+1]
push (null)
db [esp], 'Grace'
......
add esp,16 申请局部变量,我们要在程序中生成 16 个局部变量的变量名。
/**
* 分配局部变量
* @param int $count
*/
protected function _add($count)
{
for ($i = 0; $i < $count; ++$i) {
$this->v[] = new Variable('v' . $i);
}
}
push (null) 这里向栈中压入了一个 null,我们向语法树种压入一个 null 即可
protected function _push()
{
++$this->astp;
$this->ast[$this->astp] = new ConstFetch(new Name('null'));
}
为什么要向语法树中压入 null,而不是向一个栈中压入?
因为我们是解释程序代码,反编译,我们分析指令的用途,把指令对栈的操作,转换为构造语法树的操作。所以不能像栈中压入,虽然我们构造语法树的方式也是用压栈、出栈的方式。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-67089-4.html
而且这次派出的052D也是旧军舰了
一起围捕拉森号去