20135202闫佳歆-第三章家庭作业-3.63
发布日期:2021-10-24 15:11:32 浏览次数:19 分类:技术文章

本文共 1627 字,大约阅读时间需要 5 分钟。

第三章家庭作业

选题:3.63

分值:两分

作业过程:

原来的函数:

int sum_col(int n,int A[E1(n)][E2(n)],int j){
int i;
int result = 0;
for(i=0;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
goto done;loop:
result += A[i][j];
i++;
if(i
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
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
;相当于done,结束

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

总结

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

转载于:https://www.cnblogs.com/20135202yjx/p/4914440.html

转载地址:https://blog.csdn.net/weixin_30800807/article/details/94922280 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:SQL VIEW(视图)
下一篇:二分图匹配之稳定婚姻问题(题源,hdu1522)

发表评论

最新留言

逛到本站,mark一下
[***.249.79.50]2022年05月27日 13时56分50秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章