返回介绍

8.6 后期处理器

发布于 2025-03-09 23:09:34 字数 1887 浏览 0 评论 0 收藏 0

反编译器生成的目标高级语言程序可以通过后期处理器改善其质量,用语言特有的结构代替一般化的控制结构。在第 6 章的结构化分析中对语言特有的结构不予考虑,因为这些构造不具有跨多种语言的普遍性。

对于 C 语言作为目标语言的情况,for() 循环是用一个检查终止条件的 while() 循环实现。归纳变量(induction variable) 在循环之前被初始化,而且在每轮循环中在 while() 的最后一条语句上被更新。考虑下列反编译的 C 语言代码:

1 loc1 = 0;

2 while (loc1 < 8)

{

3 if (loc1 != 4)

{

4 printf ("%d", loc1);

}

5 loc1 = loc1 + 1;

}

在语句 2 上的 while() 循环对照常数 8 检查局部变量 loc1。这个变量在语句 1 被初始化,而且也在循环的最后一个语句 (即,语句 5) 被更新;因此,这个变量是一个归纳变量,而且该 while() 循环可以用一个 for 循环代替,得到以下代码:

2 for (loc1 = 0; loc1 < 8; loc1 = loc1 + 1)

{

3 if (loc1 != 4)

{

4 printf ("%d", loc1);

}

}

其中用指令 2 替换掉指令 1 和指令 5。在 C 语言中也可以使用先加指令和后加指令,因此,上面代码能够被改善成下面的:

2 for (loc1 = 0; loc1 < 8; loc1++)

{

3 if (loc1 != 4)

{

4 printf ("%d", loc1);

}

}

在 C 语言中一个 break 语句结束当前循环的执行,分支转移控制给该循环后随的第一个指令。考虑以下反编译的代码:

1 loc1= 0;

2 while (loc1 < 8)

{

3 printf ("%d", loc1);

4 if (loc1 == 4)

5 goto L1;

6 loc1 = loc1 + 1;

}

7 L1:

指令 4 检查比较局部变量 loc1 和 4,如果它们相等就执行一个 goto 跳转,转移控制给标签 L1;该循环后的第一个指令。这个控制转移等价于一个 break,这可省掉标签和 goto。而且,该循环被转换成一个 for 循环,得到下列代码:

2 for (loc1 = 0; loc1 < 8; loc1++)

{

3 printf ("%d", loc1);

4 if (loc1 == 4)

5 break;

}

类似地,可以在代码中使用 continue 语句。如果目标语言是 Ada 语言,则允许使用标签的多出口循环。当循环中使用一些 goto 跳转退出循环的時候,反编译器会生成这种结构。检查这些 goto 跳转的目标语句是否为关闭循环标签,用适当的 exit loopName 语句代替。

一般来说,任何语言特有的构造能够用在第 6 章第 6.4.3 节结构化算法里的一般化构造集表现;可以用后期处理器替换掉这些构造,但是这不是非常有必要的,因为这些构造在功能上是等价的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文