作业4

3.24

1
2
3
4
5
6
7
8
long lopp_while(long a, long b)
{
long result = 1;
while (a < b) {
result = result * (a + b);
a = a + 1;
}
}

3.25

1
2
3
4
5
6
7
8
long loop_while2(long a, long b)
{
long result = b;
while (b > 0) {
result = result * a;
b = b - a
}
}

3.28

A.

1
2
3
4
5
6
7
8
9
10
long fun_b(unsigned long x) {
long val = 0;
long i;
for(i = 64; i != 0; i--) {
val <<= 1;
val |= (x & 1);
x >>= 1;
}
return val;
}

B. i 的初始值为64,一定满足 i != 0 ,所以不必测试

C. 将 x 的各位做对称变换存在 val 中

3.30

A. -1 0 1 2 4 5 7
B. .L5 的标号为0和7

C. .L7 的标号为2和4

3.31

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void switcher(long a, long b, long c, long *dest)
{
long val;
switch(a) { /*0 2 4 5 7*/
case 5: /* Case A */
c = b ^ 15;
/* Fall through */
case 0: /* Case B */
val = c + 112;
break;
case 2: /* Case C */
case 7: /* Case D */
val = (b + c) << 2;
break;
case 4: /* Case E */
val = a;
break;
default:
val = b;
}
*dest = val;
}

3.64

A.

1
2
TYPE D[R][S][T]
&D[i][j][k] = Xd + L(S*T*i + T*j + k)

B.

R = 7

S = 5

T = 13

3.67

A.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
104  +------------------+
| |
· ·
· ·
· ·
| |
64 +------------------+ <-- %rdi
| |
56 +------------------+
| |
48 +------------------+
| |
40 +------------------+
| |
32 +------------------+
| z |
24 +------------------+
| &z |
16 +------------------+
| y |
8 +------------------+
| x |
0 +------------------+ <-- %rsp

B. %rsp+64

C. 使用 %rsp 加偏移量的方式访问元素

D. 从参数 %res+64 开始存放 r 的字段

E.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
104  +------------------+
| |
· ·
· ·
· ·
| |
88 +------------------+
| z |
80 +------------------+
| x |
72 +------------------+
| y |
64 +------------------+ <-- %rdi(eval传递的)(%rax(process返回的))
| |
56 +------------------+
| |
48 +------------------+
| |
40 +------------------+
| |
32 +------------------+
| z |
24 +------------------+
| &z |
16 +------------------+
| y |
8 +------------------+
| x |
0 +------------------+ <-- %rsp(eval函数)
| |
-8 +------------------+ <-- %rsp(process函数内)

F. 原函数将空间的地址作为参数传给被调用的函数,被调用的函数将数据存放在给定的空间内,返回该空间地址。

3.68

8(%rsi) 指向 q->t 可知,4 < B <= 8;

又由 32(%rsi) 指向 q->u 知,24 < 8 + 4 + A * 2 <= 32,即 5 < A <= 10

184(%rdi) 指向 p->y 知,176 < A*B*4 <= 184,即 44 < A*B <= 46

可得

A = 9

B = 5