for循环while循环在汇编中的表现形式

2022/10/8 3:23:56

本文主要是介绍for循环while循环在汇编中的表现形式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

#include "IO_TOOL.h"
void IterationArray(int arr[],int lenght,char chooes)
{
	char cchooes =  chooes;
	if(cchooes == 'w')
	{
		int i = 0;
		while (1)
		{

			if(i>=lenght)break;
				PRINT_INT(arr[i]);
				i++;
		}
	}
	else if(cchooes == 'f')
	{
		for (int i = 0; i < lenght; ++i)
		{
			PRINT_INT(arr[i]);
		}
	}
	else
	{
		return;
	}

}
int main(void)
{
	int iArr[] = {1,2,3};
	IterationArray(iArr,3,'f');
	PRINT_;
	IterationArray(iArr,3,'w');
	return 0;
}

首先呢是main函数有三个call分别就对应着3个函数

001115AC |  | push 66                        | ascll码 == 'f'
001115AE |  | push 3                         | 数组长度
001115B0 |  | lea eax,dword ptr ss:[ebp-14]  |
001115B3 |  | push eax                       |
001115B4 |  | call 6_3_2.array_loop.c.111046 | IterationArray函数地址
001115B9 |  | add esp,C                      |
001115BC |  | push 6_3_2.array_loop.c.11A068 | "________________________________\n"
001115C1 |  | call 6_3_2.array_loop.c.111023 | 自己定义PRINT_
001115C6 |  | add esp,4                      |
001115C9 |  | push 77                        | ascll码 == 'w'
001115CB |  | push 3                         | 数组长度
001115CD |  | lea ecx,dword ptr ss:[ebp-14]  |
001115D0 |  | push ecx                       |
001115D1 |  | call 6_3_2.array_loop.c.111046 | IterationArray函数地址
001115D6 |  | add esp,C                      |

其次呢我们需要看一下数组是怎么定义的
数组的创建过程

数组的创建过程其实就是先开辟内存空间.然后将数据依次从栈顶往栈底写入.
而不同于堆栈先进后出的理念,或者是后进先出的理念(push 3 push 2 push 1)(pop 1 pop 2 pop3) 而是直接 对堆栈的这块内存进行操作
数组创建堆栈变化
蓝色表示开辟的空间
红色表示数组实际用到的空间
为什么开辟的要多于使用的?? 这个问题估计和security_cookies这个函数有关
我也不清楚
说了那么多我们首先看一下数组遍历过程的汇编代码,这里因为我的两个循环都是写在一个函数里面,仅仅是做了对字符创的判断来区分使用哪个循环.所以看起来会比较难受所以循环的部分我重新写了一下
重写的循环
这样就比较好区分两个循环到底是怎么运行的了.
1.for循环
for循环汇编
这里其实很好理解,就是说无论如何我们执行的代码都会会到函数头,在头部进行判断是否继续执行代码
2.while循环
while循环汇编
其实while循环很大一部分要看你怎么去写,我这里写的和for其实差不多.
但是呢循环的本质都是差不多一样的,写法的不同,仅仅是稍小的差别
数组和循环的部分就到这里了



这篇关于for循环while循环在汇编中的表现形式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程