堆栈和局部变量

逆向工程 艾达 拆卸
2021-06-20 19:38:08

我正在尝试反汇编此代码:

int main()
{
    int arr[5] = {1,2,3,4,5};
    int i;
    for(i=0;i<5;i++)
    {
        printf("Element:%d\n",arr[i]);
    }
    return 0;
}

IDA 输出: sub esp, 30h

问:是什么意思?我以为会是18h(5x4+4)

1个回答

看起来您是在 amd64 下编译的(很可能在 2016 年;)。编译器分配所有堆栈内存(但不仅如此,函数参数也相同)对齐到 8 位。您假设 int 是 32 位,在您的机器上它可能是 32 位,但编译器仍然会分配 8 个字节(64 位)。所以 5*8+8=48 = 0x30。

尝试分配一个包含五个字符的数组(又名 uint8_t)。编译器仍将分配 8 个字节 * 元素数。

阅读有关属性打包 (gcc) 或编译指示包 (Windows) 的信息。