📄 9.13.5.htm
字号:
<html>
<head>
<title>9.5的解答</title>
</head>
<body background="../images/background.gif">
解:采用字节地址,两个字节作为一个机器字。<br>
(1)程序的四元式中间代码如下:<br>
B<sub>1</sub>: read N /* 置初值 */<br>
i := 2<br>
B<sub>2</sub>: if i > N goto B<sub>4</sub> /* 第一个for语句 */<br>
B<sub>3</sub>: T<sub>1</sub> := i<br>
T<sub>2</sub> := addr(A) /* 数组A的基地址 */<br>
T<sub>1</sub> := 2 * T<sub>1</sub><br>
T<sub>2</sub>[T<sub>1</sub>] := true<br>
i := i + 1<br>
goto B<sub>2</sub><br>
B<sub>4</sub>: i := 2<br>
T<sub>3</sub> := N ** 0.5<br>
T<sub>3</sub> := [T<sub>3</sub>] + 1 /* [T<sub>3</sub>]是对T<sub>3</sub>的值取整 */<br>
B<sub>5</sub>: if i > T<sub>3</sub> goto B<sub>12</sub><br>
B<sub>6</sub>: T<sub>4</sub> := i<br>
T<sub>5</sub> := addr(A)<br>
T<sub>4</sub>:= 2 * T<sub>4</sub><br>
if T<sub>5</sub>[T<sub>4</sub>] goto B<sub>8</sub><br>
B<sub>7</sub>: goto B<sub>11</sub><br>
B<sub>8</sub>: j := 2 * i<br>
B<sub>9</sub>: if j > N goto B<sub>11</sub> /* 第三个for语句 */<br>
B<sub>10</sub>: T<sub>6</sub> := j<br>
T<sub>7</sub> := addr(A)<br>
T<sub>6</sub> := 2 * T<sub>6</sub><br>
T<sub>7</sub>[T<sub>6</sub>] = false<br>
j := j + i<br>
goto B<sub>9</sub><br>
B<sub>11</sub>: i := i + 1<br>
goto B<sub>5</sub><br>
B<sub>12</sub>:
<p>(2)根据四元式的中间代码,可划分成基本块B<sub>1</sub>,B<sub>2</sub>,B<sub>3</sub>,B<sub>4</sub>,B<sub>5</sub>,B<sub>6</sub>,B<sub>7</sub>,B<sub>8</sub>,B<sub>9</sub>,B<sub>10</sub>,B<sub>11。</sub>其程序流图如下:
<p align = "center"><img src="images/e9.5a.gif"></p>
考察上面的程序流图:<br>
D(B<sub>3</sub>) = { B<sub>1</sub>, B<sub>2</sub>, B<sub>3</sub> } 又有 B<sub>3</sub> -> B<sub>2</sub>,因此 B<sub>3</sub> -> B<sub>2</sub> 是一条回边。根据它找到的循环 L<sub>1</sub> = { B<sub>2</sub>, B<sub>3</sub> }。<br>
D(B<sub>10</sub>) = { B<sub>1</sub>, B<sub>2</sub>, B<sub>4</sub>, B<sub>5</sub>, B<sub>6</sub>, B<sub>9</sub>, B<sub>10</sub> },又有 B<sub>10</sub> -> B<sub>9</sub>,所以 B<sub>10</sub> -> B<sub>9</sub> 是一条回边。根据这条回边找到循环 L<sub>2</sub> = { B<sub>9</sub>, B<sub>10</sub> }。<br>
D(B<sub>11</sub>) = { B<sub>1</sub>, B<sub>2</sub>, B<sub>4</sub>, B<sub>5</sub>, B<sub>6</sub>, B<sub>9</sub>, B<sub>11</sub> },又有 B<sub>11</sub> -> B<sub>5</sub>,因此 B<sub>11</sub> -> B<sub>5</sub> 是一条回边。根据这条回边找到循环 L<sub>3</sub> = { B<sub>11</sub>, B<sub>9</sub>, B<sub>10</sub>, B<sub>8</sub>, B<sub>7</sub>, B<sub>6</sub>, B<sub>5</sub> }<br>
(3)进行代码外提<br>
    把在循环中不随循环变化的操作提到循环外的前置结点中,且在基本块中作复写传播和删除无用赋值。结果程序流图如下:
<p align = "center"><img src="images/e9.5b.gif"></p>
(4)进行强度削弱和删除归纳变量后,其程序流图如下:
<p align = "center"><img src="images/e9.5c.gif"></p>
</body></html><br>
</p>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -