笔记 | 理解C/汇编中的数组元素访问

💡 数组元素访问方式(底层视角):数组首元素的地址 + 索引*每个元素的大小

1. C语言中的数组元素访问

语法:array[index]

  • 在C语言中,数组是连续的内存块,数组名代表数组首元素的地址,访问数组元素通过下标(索引)进行,例如arr[1];
  • 底层上,C编译器会将 arr[i] 转换为 *(arr + i),计算地址时,会考虑元素的大小,例如,如果arr是int数组(每个int占4字节),那么 arr[i] 的地址是arr + i * sizeof(int)

2. 汇编语言中的数组元素访问

  • 在汇编中(以x86为例),访问数组元素通常通过基址加变址寻址方式实现;
  • 假设数组首地址在寄存器ebx中,索引在ecx中,元素大小为4字节(如int),访问元素可以用:mov eax, [ebx + ecx*4],其中的比例因子(4)就是每个元素的大小。

机制

  • 显式计算内存地址,通过基址寄存器+偏移量访问(基址加变址寻址方式)。
  • 关键步骤
    1. 数组首地址加载到寄存器(如ebx);
    2. 索引值放入寄存器(如ecx);
    3. 计算地址:基址 + 索引 * 元素大小(比例因子1,2,4,8);
    4. mov指令读写内存

C/ASM的数组访问

|----------|-------------------|--------------------|
| 特性 | C语言 | 汇编语言 |
| 内存布局 | 连续数据块 | 连续数据块 |
| 元素类型 | 固定类型 | 固定类型 |
| 地址计算 | 编译器自动计算 | 程序员显式计算 |
| 底层操作 | 隐藏细节 | 暴露内存地址和偏移量 |
| 元素大小 | 编译时确定(如int=4) | 程序员指定(如dd=4字节) |

通过对C语言中数组访问的理解,-> 理解汇编中对数组元素的访问

场景:PE可执行文件解析,从导出函数数组中,访问目标函数