【答案】
1)a 的首地址存放在 r3;i 存放在 r2;sum 存放在 r1。
2)a[i] 的地址为 0013 E004H;a[i] 的机器数为 FFFF ECDCH;sum 的机器数为 0000 000EH;a[i] 所在页的页号是 0013EH;数组 a 至少存放在 2 页中。
3)指令机器码为 0021 2213H。汇编形式是 slli r4, r2, 1。
【解析】
1)add r4,r3,r4:这条指令将寄存器 r3 和 r4 的值相加,结果存储在寄存器 r4 中。这对应于计算数组元素的内存地址(即&a[i])。因此,我们可以推断出寄存器 r3 存储的是数组 a 的首地址,即 a 的寄存器编号为 03H。
slli r4,r2,2:这条指令将寄存器 r2 的值左移 2 位,2 结果存储在寄存器 r4 中。在 C 语言中,这对应于数组索引的计算(即 i*4,因为每个 int 类型占 4 字节)。因此,我们可以推断出寄存器 r2 存储的是变量 i 的值,即的寄存器编号位 02H。
add r1,rl,r5:这条指令将寄存器 r1 和 r5 的值相加,结果存储在寄存器 r1 中。这对应于累加操作(即 sum+=a[i])。因此,我们可以推断出寄存器 r1 存储的是变量 sum 的值,即 sum 的寄存器编号为 01H。
所以,数组 a 的首地址、变量 i 和 sum 的通用寄存器编号分别为 03H、02H 和 01H。
2)执行 sum+=a[i] 语句后,i 保持不变即 i = 5,每个数组元素占用四个字节
i=0 时,a[0] 占据存储单元 FF FF FF 7Ci=1 时,a[1] 占据存储单元 70 FE FF FFi=2 时,a[2] 占据存储单元 00 00 00 00i=3 时,a[3] 占据存储单元 3C 02 01 FFi=4 时,a[4] 占据存储单元 FF FF FF 7Ci=5 时,a[5] 占据存储单元 F0 F1 00 00i=6 时,a[6] 占据存储单元 DC EC FF FF
所以 a[i] 的地址 = 首地址 + 偏移量 = 0013 E000 + 4 * (5-1) = 0013 E004H。
a[i]的机器数按照小端编址,所以 DC 作为最低位放在最右边,以此类推可得:a[i] 的机器数 = FFFF ECDCH。
sum 的机器数 = 0000 1332H + FFFF ECDCH = (1) 0000 000EH。由于只有 32 位,所以最高位舍掉后答案为 0000 000EH。
页大小为 4KB =
212
B,所以页内地址占 12 位,去掉后 12 位剩余的则是 20 位页号,a[i] 所在页页号 = 0013EH。
我们有 20 位页号,根据题目可知数组跨页号了 0013E 和 0013D,所以数组 a 至少存放在 2 页中。
3)slli r4,r2,2 // R[r4]←R[r2]<<2
通用寄存器 r1→r5 的编号位 01H→05H。
- 6~0:由表可得:0010011
- 11~7:rd = r2 = 00010
- 14~12:由表可知为 010
- 19~15:rd = r4 = 00100
- 24~20:shamt = 2,可以为 2420:
- 31~25:由表可知为 000 0000
机器码 = 0000 0000 0010 0001 0010 0010 0001 0011B = 0021 2213H。
若 a 改为 short 类型,slli 指令的汇编形式应该是 slli r4, r2, 1。