#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循环
这里其实很好理解,就是说无论如何我们执行的代码都会会到函数头,在头部进行判断是否继续执行代码
2.while循环
其实while循环很大一部分要看你怎么去写,我这里写的和for其实差不多.
但是呢循环的本质都是差不多一样的,写法的不同,仅仅是稍小的差别
数组和循环的部分就到这里了