ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

逆向基础之C语言:C语言for循环九九乘法表以及裸汇编

2022-07-05 14:04:10  阅读:209  来源: 互联网

标签:逆向 九九乘法 int mov C语言 while 循环 ebp 反汇编


一.for循环

<1>.格式:

for( ; ;)
{

}

括号里的表达式

第1个.赋初值
第2个.判断条件
第3个.跳出循环的条件(一般自增自减) 

for循环可以是1个表达式 可以是2个表达式 可以是3个表达式.

<2>.for循环只有中间的条件表达式时反汇编跟while是一模一样的

 int fun1()
 {
     int a;
     int b;
     a=1;
     b=0;
     for(;a<=100;)
     {
         b=b+a;
         a++;
     }
     printf("%d",b);
     return 0;
 }

上面for循环代码的反汇编如下图所示

int fun2()
 {
     int a;
     int b;
     a=1;
     b=0;
     while(a<=100)
     {
         b=b+a;
         a++;
     }
     printf("%d",b);
     return 0;
 }

这是while循环代码

这是while循环反汇编,对比两个循环的反汇编,注意观察 ,for循环只有中间的条件表达式时反汇编跟while循环不能说毫无关系,只能说一模一样

<3>.for循环反汇编中间插了个jmp 一眼就可看出是for循环

二.for循环九九乘法表

int fun()
{
    int a;
    int b;
    for(a=1;a<=9;a++)
    {
        for (b=1;b<=a;b++)
        {
            printf("%d*%d=%d\t",b,a,b*a);
        }
        printf("\n");
 
    }
    return 0;
}

代码如上所示,打印出来如下图所示

三.for循环九九乘法表裸汇编

char*p="%d*%d=%d\t";
char*p1="\n";
char*p2="这是for循环裸汇编运行出来的\n";
_declspec(naked) int fund()
{
    _asm
    {
          push ebp
          mov ebp,esp
          sub esp,0x48
          push ebx
          push esi
          push edi
          lea edi,dword ptr ds:[ebp-0x48]
          mov ecx,0x12
          mov eax,0xcccccccc
          stosd
//a=1
          mov dword ptr ds:[ebp-0x4],0x1
          jmp lab1
lab4:
          //a++
          mov eax,dword ptr ds:[ebp-0x4]
          add eax,0x1
          mov dword ptr ds:[ebp-0x4],eax
lab1:
          //a<=9
          cmp dword ptr ds:[ebp-0x4],0x9
          jg lab7
 
          //b=1
          mov dword ptr ds:[ebp-0x8],0x1
          jmp lab2
lab6:
          //b++
          mov ecx,dword ptr ds:[ebp-0x8]
          add ecx,0x1
          mov dword ptr ds:[ebp-0x8],ecx
lab2:
          //b<=a
          mov edx,dword ptr ds:[ebp-0x4]
          cmp DWORD ptr ds:[ebp-0x8],edx
          jg lab3
          mov eax,dword ptr ds:[ebp-0x8]
          imul eax,dword ptr ds:[ebp-0x4]
          push eax
          push DWORD ptr ds:[ebp-0x4]
          push DWORD ptr ds:[ebp-0x8]
          mov ecx,p
          push ecx
          call printf
          add esp,0x10
          jmp lab6
lab3:
          mov edx,p1
          push edx
          call printf
          add esp,0x4
          jmp lab4
lab7:
          mov edx,p2
          push edx
          call printf
          add esp,0x4
          xor eax,eax
 
 
          pop edi
          pop esi
          pop ebx
          mov esp,ebp
          pop ebp
          ret
 
    }
 
 
}

for循环九九乘法表裸汇编如上,打印出来如下图片所示


今天的文章就到这里了,如果有任何不明白的地方欢迎与我交流,我必定知无不言。这篇文章也花了一定的心血,喜欢的小伙伴可以点赞关注哦。感激不尽!

搜索

复制

标签:逆向,九九乘法,int,mov,C语言,while,循环,ebp,反汇编
来源: https://www.cnblogs.com/nixiangxiaoxing/p/16446117.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有