汇编多重循环练习
来源:互联网 发布: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
- 汇编多重循环练习
- 汇编Q2: 多重循环
- 汇编—多重循环—矩阵乘法
- C语言 第六章 多重循环练习
- 反汇编个人练习:不用循环语句实现循环操作
- 多重循环
- 多重循环
- 多重循环
- 170405 汇编-嵌套循环练习,OD-界面介绍
- 汇编练习
- 跳出多重循环
- java跳出多重循环
- python跳出多重循环
- 跳出多重for循环
- java跳出多重循环
- Java跳出多重循环
- HDU4334(多重循环)
- Java跳出多重循环
- 网站盈利的10种方式
- AndroidResideMenu
- 英语培训日益提升的经验水平应多方考量
- 第一天
- 各种排序算法
- 汇编多重循环练习
- thinkphp 模板分组 目录结构设置
- 内存泄露排查实战手记
- BootStrap学习从现在开始
- struts 核心解析
- 55分钟学会正则表达式
- Bootstrap3.0学习第一轮(入门)
- .net 在后台设置前台标签的属性值
- 知乎上那些简短而精辟的对话