[IDA] 分析for循环的汇编代码

简介:     在程序设计语言里面,循环是三种语言流程之一(顺序,分支,循环),这其中循环又是编程这件事中最具魅力的,它发挥了人在思维和计算机在计算方面的双方优势,体现了程序员的技巧和智慧,也体现了代码的简洁,优雅和优美。

    在程序设计语言里面,循环是三种语言流程之一(顺序,分支,循环),这其中循环又是编程这件事中最具魅力的,它发挥了人在思维和计算机在计算方面的双方优势,体现了程序员的技巧和智慧,也体现了代码的简洁,优雅和优美。循环中最常用的应该是 for 循环,其他几种例如while,do while又基本上可以等效写成 for 循环。同时 for 循环又可以被等效改写为递归函数。本文首先通过VC创建一个含有for循环的简单函数的工程,然后用IDA工具分析其汇编代码。

 

    for循环主要由以下形式组成,例如:

    for( i = 0; i < imax; i++) { ... }

    可以将其看做有四个基本部分构成,即初始化语句( i = 0 ), 条件语句(i < imax), 主体后续语句 (i++), 和供循环重复执行的主体({。。。})。首先用VC创建一个Win32 Console 程序,我们输入一个含有for循环的简单函数,代码如下:

 

 

#include  " stdafx.h "
#include 
< string .h >

int  getstring( char *  s)
{
    
int  length  =  strlen(s);
    
int  i;
    
for (i = 0 ; i < length; i ++ )
    {
        
// 取余(%)优先级比加减(+-)高!
        s[i]  =  (s[i]  -   ' a '   +   1 ) % 26   +   ' a ' ;
    }
    
return  length;
}

int  main( int  argc,  char *  argv[])
{
    
char  s[]  =   " abcdefg\0 " ;
    
int  result  =  getstring(s);
    printf(
" %s\n " , s);
    
return   0 ;
}

 

 

    简要介绍以下上面的代码,函数 getstring 用于对输入的字符串(假设输入的字符串全部有小写字母a-z组成),把字符串中每个字符改为其下一个英文字符(例如a改为b,b改为c,...,z改为a)。因此上面的程序我们在main里面初始化一个字符串为“abcdefg”,输出“bcdefgh”。

 

    下面我们用IDA查看其反汇编代码(win32 debug):在汇编代码中,getstring 函数和 main 函数和我们的C++代码中出现的顺序相同,可以看到:

    getstring 函数从 00401020H ~ 00401095H (代码量: 118 bytes,按 16bytes 对齐后实际占据 160bytes);

    main 函数从 004010C0H ~ 00401124H (代码量:101 bytes, 对齐后实际占据 128 bytes);

    在函数和函数之间,用0xCC进行填充,以使函数开始地址都位于16bytes整数倍处;

 

    我们先简要看下 main 函数,很显然,字符串 s 是在 main函数内 的栈上空间:汇编代码如下:

 

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码main
. text: 004010C0  main            proc near                ;  CODE XREF: j_main
目录
相关文章
|
3月前
|
网络协议 C++
解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
|
4月前
|
存储 算法 程序员
神秘代码世界惊现高效秘籍!究竟是什么让汇编语言编程如此强大?快来一探究竟!
【8月更文挑战第31天】《代码之美:探索高效汇编语言编程的最佳实践》介绍了汇编语言在系统内核、嵌入式系统及高性能应用中的不可替代作用。书中强调了深入理解处理器架构、提升代码可读性、优化算法与数据结构及有效利用寄存器等最佳实践的重要性。通过具体示例,如在 x86 架构下实现高效的加法函数,展示了如何运用这些技巧编写出既高效又可靠的汇编代码,充分展现了汇编语言的独特魅力及其在现代软件开发中的价值。
50 0
|
3月前
|
Windows
【原创】DOS下TSR程序的汇编演示代码2--黑屏保护程序
【原创】DOS下TSR程序的汇编演示代码2--黑屏保护程序
【原创】DOS下TSR程序的汇编演示代码1--自动按键程序
【原创】DOS下TSR程序的汇编演示代码1--自动按键程序
|
4月前
|
NoSQL 前端开发 程序员
【震撼揭秘!】程序员绝不会告诉你的秘密:掌握汇编语言调试,轻松从软件故障中全身而退——透视代码底层,成为Bug猎人!
【8月更文挑战第31天】《调试的艺术:如何利用汇编语言追踪和解决软件问题》探讨了使用汇编语言进行高效调试的方法。无论是初学者还是资深开发者,面对棘手的 bug 时,高级语言的信息往往不足。文章通过具体示例展示如何通过汇编代码定位问题,如 C 语言中数组求和函数的崩溃问题。借助 `gcc -S` 生成的汇编代码和 GDB 调试器,可以深入理解程序行为,从而更准确地解决问题。掌握这一技能,将使你在复杂问题面前更加从容。
47 2
|
4月前
|
C语言
51单片机汇编语言流水灯代码
51单片机汇编语言流水灯代码
100 1
|
4月前
|
C# 开发者 图形学
Xamarin 竟在游戏开发领域大胆探索,跨平台优势与强大功能结合,开启游戏开发新潮流!
【8月更文挑战第31天】《Xamarin在游戏开发领域的探索》介绍了Xamarin作为跨平台开发框架,在移动游戏开发中的应用。它利用C#语言的优势,提供高效的开发体验,并结合各平台图形库实现高质量画面。本文还展示了Xamarin如何简化游戏逻辑处理、支持多线程编程及与Unity等工具集成,提升游戏质量和开发效率。此外,Xamarin还支持热更新和多平台发布,进一步优化游戏维护流程。
47 0
|
7月前
|
存储 Unix 编译器
汇编语言----X86汇编指令
汇编语言----X86汇编指令
276 2
|
2月前
|
存储 移动开发 C语言
【ARM汇编速成】零基础入门汇编语言之指令集(三)
【ARM汇编速成】零基础入门汇编语言之指令集(三)
|
2月前
|
编译器 C语言 计算机视觉
【ARM汇编速成】零基础入门汇编语言之指令集(二)
【ARM汇编速成】零基础入门汇编语言之指令集(二)
224 0