动态线条
动态线条end

汇编:C语言for转汇编

for循环是C语言中常用的三循环之一,基本用法如下

for(变量初始化操作;判断是否执行循环;变量增减操作){
	//功能代码
}

第一种:三中操作都存在

C语言代码

#include <stdio.h>

void F(int n){
	int i;
	for (i = 0; i < n; i++){
		printf("%d\n", i);
	}
}

int main(){
	F(10);
	return 0;
}

对应汇编

image-20220216142735161

image-20220216144108266

;提升堆栈
00F83C00  push        ebp  
00F83C01  mov         ebp,esp  
00F83C03  sub         esp,0CCh  
;保存现场
00F83C09  push        ebx  
00F83C0A  push        esi  
00F83C0B  push        edi  
;初始化堆栈
00F83C0C  lea         edi,[ebp+FFFFFF34h]  
00F83C12  mov         ecx,33h  
00F83C17  mov         eax,0CCCCCCCCh  
00F83C1C  rep stos    dword ptr es:[edi]  
;for循环代码
00F83C1E  mov         dword ptr [ebp-8],0  ;初始化for参数
00F83C25  jmp         00F83C30  
00F83C27  mov         eax,dword ptr [ebp-8]  
00F83C2A  add         eax,1  ;自增运算
00F83C2D  mov         dword ptr [ebp-8],eax  
00F83C30  mov         eax,dword ptr [ebp-8]  
00F83C33  cmp         eax,dword ptr [ebp+8]  ;比较操作,i < n
00F83C36  jge         00F83C55  
00F83C38  mov         esi,esp  
00F83C3A  mov         eax,dword ptr [ebp-8]  
00F83C3D  push        eax  
00F83C3E  push        0F858A8h  
00F83C43  call        dword ptr ds:[00F89114h]  ;调用printf
00F83C49  add         esp,8  ;调用完函数的堆栈平衡
00F83C4C  cmp         esi,esp  
00F83C4E  call        00F8113B  
00F83C53  jmp         00F83C27  ;重复for循环
;恢复现场
00F83C55  pop         edi  
00F83C56  pop         esi  
00F83C57  pop         ebx  
00F83C58  add         esp,0CCh  
00F83C5E  cmp         ebp,esp  
00F83C60  call        00F8113B  
00F83C65  mov         esp,ebp  
00F83C67  pop         ebp  
00F83C68  ret  

第二种:三种操作都不写

C语言代码

#include <stdio.h>

void F(int n){
	int i = 0;
	for (;;){
		printf("%d\n", i);
	}
}

int main(){
	F(10);
	return 0;
}

对应汇编代码

image-20220216145527049

009513C0  push        ebp  
009513C1  mov         ebp,esp  
009513C3  sub         esp,0CCh  
009513C9  push        ebx  
009513CA  push        esi  
009513CB  push        edi  
009513CC  lea         edi,[ebp+FFFFFF34h]  
009513D2  mov         ecx,33h  
009513D7  mov         eax,0CCCCCCCCh  
009513DC  rep stos    dword ptr es:[edi]  
009513DE  mov         dword ptr [ebp-8],0  
009513E5  mov         esi,esp  
009513E7  mov         eax,dword ptr [ebp-8]  
009513EA  push        eax  
009513EB  push        955858h  
009513F0  call        dword ptr ds:[00959114h]  
009513F6  add         esp,8  
009513F9  cmp         esi,esp  
009513FB  call        0095113B  
00951400  jmp         009513E5  
00951402  pop         edi  
00951403  pop         esi  
00951404  pop         ebx  
00951405  add         esp,0CCh  
0095140B  cmp         ebp,esp  
0095140D  call        0095113B  
00951412  mov         esp,ebp  
00951414  pop         ebp  
00951415  ret  

综上可知,for循环一般分为四部分,而如果for循环中任何操作都不写,那么将生成死循环汇编代码

  1)初始化块

  2)判断是否执行块

  3)执行功能块

  4)改变变量块

posted @ 2022-02-16 15:01  v1v1v1  阅读(342)  评论(0编辑  收藏  举报