第三章家庭作业
选题:3.63
分值:两分
作业过程:
原来的函数:
int sum_col(int n,int A[E1(n)][E2(n)],int j){ int i; int result = 0; for(i=0;i
转化为goto代码的版本:
int sum_col(int n,int A[E1(n)][E2(n)],int j){ int i=0; int result = 0; if(!(i
在书中给的汇编代码中,逐句分析如下:
movl 8(%ebp),%edx ;把ebp+8中的值赋给edx,也就是n leal (%edx,%edx),%eax ;eax中的值等于两倍的edx中的值,即2n leal -1(%eax),%ecx ;ecx中的值等于eax中的值-1,即2n-1 leal (%eax,%edx),%esi ;esi中的值等于eax的值加edx的值,即3n,esi存储的是E1(n)的值 movl $0,%eax ;eax置零,eax存储的是result的值 testl %esi,%esi ;检查esi中的值是正、负还是0 jle .L3 ;因为初始化i是0,如果esi中的E1(n)≤0的话,就满足!(i
所以,由上面的逐句分析可得,esi中存储的是E1(n)的值,E1(n)=3n;
E2(n)储存在ebx中,ebx=4*E2(n),所以E2(n)=2n-1.总结
这道题锻炼了我对汇编语言的分析过程,知道每一句对应的动作,不同指令的用法,寄存器中的数值的变化等等;同时还练习了for循环是如何在汇编中被实现的,这道题如果直接对着原函数分析不好分析,但是转变为goto形式的代码后就比较直接、一目了然