草庐IT

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

nixiangxiaoxing 2023-03-28 原文

一.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循环九九乘法表裸汇编如上,打印出来如下图片所示


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

有关逆向基础之C语言:C语言for循环九九乘法表以及裸汇编的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  3. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  4. ruby-on-rails - Rails 中的 NoMethodError::MailersController#preview undefined method `activation_token=' for nil:NilClass - 2

    似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai

  5. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  6. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  7. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

  8. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  9. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  10. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

随机推荐