汇编多重循环练习

来源:互联网 发布:java面向对象试题 编辑:程序博客网 时间:2024/05/22 03:45

<p></p>
<p>学了汇编接近两个月了,只是看书,练习很少,即使有代码也很快扔了,所以从今天起我也开始写博客,记录我的汇编学习之旅。题目是我从网上找的,好像是c语言练习的题目</p><p></p><p><span style="font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 18px; background-color: rgb(245, 250, 254); ">习题1:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?</span></p><p><span style="font-family: Verdana, Arial, Helvetica, sans-serif; "><span style="line-height: 18px; ">以下为vs2012实现的高级语言代码</span></span></p>
#include "stdafx.h"/*习题1:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?*/int _tmain(int argc, _TCHAR* argv[]){int num1 = 1,num2 = 2,num3 = 3,num4 = 4;for(int i=num1;i<=num4;++i)for(int j=num1;j<=num4;++j)for(int k=num1;k<=num4;++k){if(i!=j && i!=k && j!=k)printf("%d%d%d ",i,j,k);}return 0;}

然后上我用汇编写的代码

.386.model flat,stdcalloption casemap:noneinclude windows.incincludeuser32.incincludekernel32.incincludemsvcrt.incincludelibmsvcrt.libincludelibuser32.libincludelibkernel32.lib..dataszFormatdb"%d%d%d ",0.code;*************************************************************************;eax为第一层循环所取数字,ebx为第二层循环所取数字,edx为第三次循环所取数字;*************************************************************************main PROCmovecx,4for_process0:;第一层循环moveax,ecxpushecxmovecx,4for_process1:;第二层循环movebx,ecxpushecxcmpeax,ebx;第一次比较jecontinue1movecx,4for_process2:;第三层循环movedx,ecxcmpeax,ecx;第二次比较jecontinue2cmpebx,edx;第三次比较jecontinue2pushadINVOKEcrt_printf,addr szFormat,eax,ebx,edxpopadcontinue2:loopfor_process2continue1:popecxloopfor_process1continue0:popecxloopfor_process0invokeExitProcess,NULLmain endpEND  main

编写心得:由于在调用函数crt_printf时忘了使用pushad,导致错误,查了很长时间,可见看书会了和编写会了是两码事

接下来上vs反编译的,和自己的对比一下

000D13D0  push        ebp  000D13D1  mov         ebp,esp  000D13D3  sub         esp,114h  000D13D9  push        ebx  000D13DA  push        esi  000D13DB  push        edi  000D13DC  lea         edi,[ebp-114h]  000D13E2  mov         ecx,45h  000D13E7  mov         eax,0CCCCCCCCh  000D13EC  rep stos    dword ptr es:[edi]  int num1 = 1,num2 = 2,num3 = 3,num4 = 4;000D13EE  mov         dword ptr [num1],1  000D13F5  mov         dword ptr [num2],2  000D13FC  mov         dword ptr [num3],3  000D1403  mov         dword ptr [num4],4  for(int i=num1;i<=num4;++i)000D140A  mov         eax,dword ptr [num1]  000D140D  mov         dword ptr [ebp-38h],eax  000D1410  jmp         wmain+4Bh (0D141Bh)  000D1412  mov         eax,dword ptr [ebp-38h]  000D1415  add         eax,1  000D1418  mov         dword ptr [ebp-38h],eax  000D141B  mov         eax,dword ptr [ebp-38h]  000D141E  cmp         eax,dword ptr [num4]  000D1421  jg          wmain+0C9h (0D1499h)  for(int j=num1;j<=num4;++j)000D1423  mov         eax,dword ptr [num1]  for(int j=num1;j<=num4;++j)000D1426  mov         dword ptr [ebp-44h],eax  000D1429  jmp         wmain+64h (0D1434h)  000D142B  mov         eax,dword ptr [ebp-44h]  000D142E  add         eax,1  000D1431  mov         dword ptr [ebp-44h],eax  000D1434  mov         eax,dword ptr [ebp-44h]  000D1437  cmp         eax,dword ptr [num4]  000D143A  jg          wmain+0C4h (0D1494h)  for(int k=num1;k<=num4;++k)000D143C  mov         eax,dword ptr [num1]  000D143F  mov         dword ptr [ebp-50h],eax  000D1442  jmp         wmain+7Dh (0D144Dh)  000D1444  mov         eax,dword ptr [ebp-50h]  000D1447  add         eax,1  000D144A  mov         dword ptr [ebp-50h],eax  000D144D  mov         eax,dword ptr [ebp-50h]  000D1450  cmp         eax,dword ptr [num4]  000D1453  jg          wmain+0C2h (0D1492h)  {if(i!=j && i!=k && j!=k)000D1455  mov         eax,dword ptr [ebp-38h]  {if(i!=j && i!=k && j!=k)000D1458  cmp         eax,dword ptr [ebp-44h]  000D145B  je          wmain+0C0h (0D1490h)  000D145D  mov         eax,dword ptr [ebp-38h]  000D1460  cmp         eax,dword ptr [ebp-50h]  000D1463  je          wmain+0C0h (0D1490h)  000D1465  mov         eax,dword ptr [ebp-44h]  000D1468  cmp         eax,dword ptr [ebp-50h]  000D146B  je          wmain+0C0h (0D1490h)  printf("%d%d%d ",i,j,k);000D146D  mov         esi,esp  000D146F  mov         eax,dword ptr [ebp-50h]  000D1472  push        eax  000D1473  mov         ecx,dword ptr [ebp-44h]  000D1476  push        ecx  000D1477  mov         edx,dword ptr [ebp-38h]  000D147A  push        edx  000D147B  push        0D5858h  000D1480  call        dword ptr ds:[0D92BCh]  000D1486  add         esp,10h  000D1489  cmp         esi,esp  000D148B  call        __RTC_CheckEsp (0D1140h)  }000D1490  jmp         wmain+74h (0D1444h)  000D1492  jmp         wmain+5Bh (0D142Bh)  000D1494  jmp         wmain+42h (0D1412h)  return 0;000D1499  xor         eax,eax  }000D149B  pop         edi  000D149C  pop         esi  000D149D  pop         ebx  000D149E  add         esp,114h  000D14A4  cmp         ebp,esp  000D14A6  call        __RTC_CheckEsp (0D1140h)  000D14AB  mov         esp,ebp  000D14AD  pop         ebp  000D14AE  ret  


我感觉我写的和vs反编译不同的是高级语言用的是三重循环,我也就用了三重循环,而反编译的基本用的是跳转指令,但是我感觉他那个跳转好奇怪,有好多好像没用,看的不是很懂,明显我的三重循环有点复杂,以后还是尽量用跳转


0 0
原创粉丝点击