內存分配
示例1
int a[5] = {1,2,3,4,5}
彙編結果:
movl $0x1c,0x1f(%esp)
: 把立即數1存放在esp寄存器中指向地址+0x1c的地址( 0x6afefc)中- 後面的代碼分別存儲2,3,4, 5 到依次偏移4個字節的地址中(int 佔 4個字節)
- 在memory中查看6afefc地址中的數據
示例2
int *a = new int[3];
彙編結果:
movl $0xc,(%esp)
把立即數12存放在寄存器esp指向的地址中
表明需要12個字節的存儲空間、
示例3
int *a = new int[3];
*a = 1;
*(a+1) = 2;
*(a +2) = 3;
彙編結果:
movl $0xc,(%esp)
同上mov %eax,0x1c(%esp)
把寄存器eax的值存儲在0x1c(%esp)這個地址中mov 0x1c(%esp),%eax
恢復寄存器eax的值movl $0x1,(%eax)
把立即數1存到eax寄存器指向的地址中
後續步驟依次是:
- 恢復寄存器eax的值
- 在寄存器eax指向地址向後移動4個字節的地址中存儲存儲立即數2
- 由於add把結果保存在eax中,此時eax是722ac4,知道初值應該是:722ac0 (其實就是0x1c(%esp) 中存儲的值)
- 在memory中查看722aco,發現依次存放1 和 2