多维数组汇编解析
学过C语言的都会了解局部变量是没有内存单元的,而在这里的x是全局变量是有内存单元的,我们下面定义的Function函数我们也可以看成是全局变量,如果在main函数中使用要给它强制类型转换。。。
C语言:
接下来我们看一下我们将Function函数看成全局变量它会变成什么?
C语言:
根据这个输出结果我们可以把这个输出结果当成是地址。
接下来我们看看数组越界了为什么还能运行呢?
C语言:
这段代码是可以编译通过的。。
汇编:
上面的汇编代码是函数的准备部分和分配内存空间,以及恢复现场和回复堆栈。。。
C语言:
我们会看到明显arr[6]是越界的,但是在这里是可以运行的。。。。
我们来看看汇编代码:
我们会看到
我们将0x12345678存到了ebp+4这个存储空间去了,如果了解堆栈图的人会知道,当前这个ebp+4是pop到eip当中的,变成完成当前这个Function函数之后执行的eip的值,这快也可称为函数的返回地址,这里跟call指令相同。。。
通过上面的例子我们了解到,如果数组越界,他会读取堆栈里的其它数据。。
这回我们看看换成函数的方式
C语言:
看看这个汇编代码:
这里的offset可以理解为标识的意思,标识这Helloworld是个地址
正常Helloworld是
我们接下来看下一数组
C语言:
汇编:
接下来是二位数组:
C语言:
汇编:
我们会看到二维数组的汇编跟一位数组的汇编存储方式是一样的。。。
现在我们来看三位数组:
例如:arr[5][4][3],现在我们找arr[1][2][1]那它在编译器中是如何寻找的呢???
ta会143+ 23+1(如果是二维数组arr[3][4],我们要找arr[1][2]ta的计算方式就是14+2)
arr[n][m][k][w][r]:arr[2][3][4][2][2],那么他的计算公式就是:2mkwr+3kwr+4wr+2r+2