c++ 內存分配過程(通過彙編,寄存器和Memory分析)

內存分配

示例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
發佈了36 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章