zoukankan      html  css  js  c++  java
  • 反汇编:循环

    #include<stdio.h>
    
    int main(){
    	for(int i=0;i<10;i++)
    		printf("%d",i);
    
    	return 0;
    }
    
    00401010 >|> 55            PUSH EBP
    00401011  |.  8BEC          MOV EBP,ESP
    00401013  |.  83EC 44       SUB ESP,44
    00401016  |.  53            PUSH EBX
    00401017  |.  56            PUSH ESI
    00401018  |.  57            PUSH EDI
    00401019  |.  8D7D BC       LEA EDI,DWORD PTR SS:[EBP-44]
    0040101C  |.  B9 11000000   MOV ECX,11
    00401021  |.  B8 CCCCCCCC   MOV EAX,CCCCCCCC
    00401026  |.  F3:AB         REP STOS DWORD PTR ES:[EDI]
    00401028  |.  C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0
    0040102F  |.  EB 09         JMP SHORT dia.0040103A
    00401031  |>  8B45 FC       /MOV EAX,DWORD PTR SS:[EBP-4]            ;  把变量的值赋值给eax
    00401034  |.  83C0 01       |ADD EAX,1                               ;  eax 加1
    00401037  |.  8945 FC       |MOV DWORD PTR SS:[EBP-4],EAX            ;  +1处理后 赋值给原来存储变量的地址
    0040103A  |>  837D FC 0A     CMP DWORD PTR SS:[EBP-4],0A             ;  判断次数是否有10次
    0040103E  |.  7D 13         |JGE SHORT dia.00401053                  ;  如果当前变量的值等于A
    00401040  |.  8B4D FC       |MOV ECX,DWORD PTR SS:[EBP-4]            ;  变量的值 赋值给 ecx
    00401043  |.  51            |PUSH ECX                                ; /<%d>
    00401044  |.  68 1C204200   |PUSH OFFSET dia.??_C@_02MHAC@?$CFp?$AA@ ; |format = "%d"
    00401049  |.  E8 22000000   |CALL dia.printf                         ; printf
    0040104E  |.  83C4 08       |ADD ESP,8                               ;  栈顶下降
    00401051  |.^ EB DE         JMP SHORT dia.00401031
    

    函数数组循环:

    #include<stdio.h>
    
    bool toFor(int arr[],int n){
    	for(int i=0;i<n;i++)
    		printf("%d
    ",arr[i]);
    	return true;
    }
    
    int main(){
    	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    	toFor(arr,10);
    	return 0;
    }
    
    00401038  |.  C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0               ;  把0赋值给 一个地址指向的值
    0040103F  |.  EB 09         JMP SHORT dia.0040104A                   ;  跳转
    00401041  |>  8B45 FC       /MOV EAX,DWORD PTR SS:[EBP-4]            ;  把当前变量的值赋值给eax
    00401044  |.  83C0 01       |ADD EAX,1                               ;  变量递增1
    00401047  |.  8945 FC       |MOV DWORD PTR SS:[EBP-4],EAX            ;  改变当前变量的值,值为eax
    0040104A  |>  8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]            ;  把当前的值赋值给ecx,ecx是用来存储次数的,这里我代码写的不好,计数的时候和变量的值是一样的,比较容易混淆
    0040104D  |.  3B4D 0C       |CMP ECX,DWORD PTR SS:[EBP+C]            ;  比较次数是否为A
    00401050  |.  7D 19         |JGE SHORT dia.0040106B                  ;  如果为A的话 则跳出循环
    00401052  |.  8B55 FC       |MOV EDX,DWORD PTR SS:[EBP-4]            ;  将当前存储的变量赋值给edx
    00401055  |.  8B45 08       |MOV EAX,DWORD PTR SS:[EBP+8]            ;  存储的第一个变量中的值赋值给eax
    00401058  |.  8B0C90        |MOV ECX,DWORD PTR DS:[EAX+EDX*4]        ;  递增eax的地址,准备处理下一个地址中的变量
    0040105B  |.  51            |PUSH ECX                                ; /<%d>
    0040105C  |.  68 1C204200   |PUSH OFFSET dia.??_C@_03HMFC@?$CFd?6?$A>; |format = "%d
    "
    00401061  |.  E8 DA000000   |CALL dia.printf                         ; printf
    00401066  |.  83C4 08       |ADD ESP,8                               ;  降低栈顶,因为当前堆栈的地址已经没用了,需要降低
    00401069  |.^ EB D6         JMP SHORT dia.00401041
    0040106B  |>  B0 01         MOV AL,1
    0040106D  |.  5F            POP EDI
    0040106E  |.  5E            POP ESI
    0040106F  |.  5B            POP EBX
    00401070 >|.  83C4 44       ADD ESP,44
    00401073  |.  3BEC          CMP EBP,ESP
    00401075  |.  E8 46010000   CALL dia.__chkesp
    0040107A  |.  8BE5          MOV ESP,EBP
    0040107C  |.  5D            POP EBP
    0040107D  .  C3            RETN
    

    函数数组指针循环:

    #include<stdio.h>
    
    bool toFor(int* arr,int n){
    	for(int i=0;i<n;i++)
    		printf("%d
    ",arr[i]);
    	return true;
    }
    
    int main(){
    	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    	toFor(arr,10);
    	return 0;
    }
    

    你会发现汇编代码跟上面的是一样的!

  • 相关阅读:
    mysql 配置
    idea 学会看log文件
    ac自动机(tree+kmp模板)
    矩阵快速幂(纯数学递推)
    矩阵快速幂(queue递推)
    RMQ(连续相同最大值)
    dp(过河问题)
    bfs(火星撞地球)
    相同子序列集合
    图博弈
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12339791.html
Copyright © 2011-2022 走看看