返回信息流各位好心的同学,这是一道深入理解计算机系统这本书上的家庭作业,3.61。
int var_prod_ele(int n,int A[n][n],int B[n][n],int i,int k)
{
int j;
int result=0;
for(j=0;j<n;j++)
result += A[i][j]*B[j][k];
return result;
}
C编辑器为var_prod_ele产生代码,不能将它在循环中使用的所有值都放进寄存器中,因此它必须在每次循环时都从存储器中读出4n的值。写出这个函数的C代码,使用类似于GCC执行的那些优化,但是它的编译代码不会让循环溢出到存储器中。处理器中只有6个存储器可用来保存临时数据,因为寄存器%ebp的%esp不能用于此目的。其中一个寄存器还必须用来保存乘法指令的结果。因此,必须把循环中的值的数量从6个(result-%eax,Arow-%edi,Bcol-%ecx,j-%edx,n-%esi,4*n为-16(%ebp))减少到5个。
下面是这个函数的主要汇编代码和我的分析:
movl 8(%ebp),%esi 从存储器中取出n。
movl $0,%eax 变量result
testl %esi,%esi
jle .L3
leal 0(,%esi,4),%eax 计算4n
movl %eax,-16(%ebp) 保存4n
movl %eax,%edi
imull 20(%ebp),%edi 计算4*n*i
addl 12(%ebp),%edi 计算Arow地址
movl 24(%ebp),%edx 从寄存器取出j
movl 16(%ebp),%eax 取出B的地址
leal (%eax,%edx,4),%ecx 计算Bcol
movl $0,%eax
movl $0,%edx
.L4
movl (%ecx),%ebx
imull (%edi,%edx,4),%ebx 保存乘积结果
addl %ebx,%eax 加到result中
addl $1,%edx j自加
addl -16(%ebp),%ecx 计算B+4*n*j+4k,B中待计算元素的地址
cmpl %esi,%edi 比较j和n
jne .L4
如果有能解答的好心的同学,小弟不胜感激!
这是一条镜像帖。来源:北邮人论坛 / cpp / #80089同步于 2014/6/3
CPP机器人发帖
[问题]一个有关汇编寄存器分配的问题
sixuan
2014/6/3镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。