• 20135202闫佳歆-第三章家庭作业-3.63


    第三章家庭作业

    选题:3.63

    分值:两分

    作业过程:

    原来的函数:

    int sum_col(int n,int A[E1(n)][E2(n)],int j)
    {
    	int i;
    	int result = 0;
    	for(i=0;i<E1(n);i++)
    		result += A[i][j];
    	return result;
    }
    

    转化为goto代码的版本:

    int sum_col(int n,int A[E1(n)][E2(n)],int j)
    {
    	int i=0;
    	int result = 0;
    	if(!(i<E1(n)))
    		goto done;
    loop:
    	result += A[i][j];
    	i++;
    	if(i<E1(n))
    		goto loop;
    done:
    	return result;
    }
    

    在书中给的汇编代码中,逐句分析如下:

    	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<E1(n))跳转到done
    	leal	0(,%ecx,4),%ebx	   ;ebx中的值等于0+4*ecx=4(2n-1)
    	movl	16(%ebp),%eax	   ;eax中的值等于ebp+16,即j的地址
    	movl	12(%ebp),%edx	   ;edx中的值等于ebp+12,即A[i]的地址
    	leal	(%edx,%eax,4),%ecx ;ecx中的值等于[edx+4*eax]中的值,即A[i][j]
    	movl	$0,%edx		   ;edx中的值置零
    	movl	$0,%eax		   ;eax中的值置零
    .L4				   ;相当于loop
    	addl	(%ecx),%eax	   ;eax中的值+=ecx中的地址,即A[i][j]的地址
    	addl	$1,%edx		   ;edx中的值加一,可以看出edx存放的是i
    	addl	%ebx,%ecx	   ;ecx中的值加上ebx中的值放到ecx中,即ecx内值为A[i+1][j]
    	cmpl	%esi,%edx	   ;比较esi与edx中的值,即比较E1(n)和i的值
    	jl		.L4	   ;如果i<E1(n),跳转回.L4,相当于回到loop中的循环
    .L3				   ;相当于done,结束
    

    所以,由上面的逐句分析可得,esi中存储的是E1(n)的值,E1(n)=3n;
    E2(n)储存在ebx中,ebx=4*E2(n),所以E2(n)=2n-1.

    总结

    这道题锻炼了我对汇编语言的分析过程,知道每一句对应的动作,不同指令的用法,寄存器中的数值的变化等等;同时还练习了for循环是如何在汇编中被实现的,这道题如果直接对着原函数分析不好分析,但是转变为goto形式的代码后就比较直接、一目了然

  • 相关阅读:
    数列分段 II
    Best Cow Fences
    愤怒的牛
    linux 查看文件
    糖果传递
    BL刀片更换主板设置raid
    glance启停
    depot制作
    刀片服务器密码过期, console无法登录解决方案
    DP无法删除失效的多路径链路方法
  • 原文地址:https://www.cnblogs.com/20135202yjx/p/4914440.html
Copyright © 2020-2023  润新知