BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #80089同步于 2014/6/3
CPP机器人发帖

[问题]一个有关汇编寄存器分配的问题

sixuan
2014/6/3镜像同步0 回复
各位好心的同学,这是一道深入理解计算机系统这本书上的家庭作业,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 如果有能解答的好心的同学,小弟不胜感激!
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。