首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言變量賦值底層機制:從汇編視角看 int b = a 發生了什麼

     編輯:程式設計疑難解答

看似簡單的 int a = 3; int b; b = a; 在底層經歷了怎樣的內存操作?通過反汇編(x86,MSVC 編譯器)可見端倪。

反汇編代碼註釋

void main() {
  00FE14A0 push ebp
  00FE14A1 mov ebp, esp
  00FE14A3 sub esp, 0D8h        ; 分配棧幀空間
  00FE14A9 push ebx
  00FE14AA push esi
  00FE14AB push edi
  00FE14AC lea edi, [ebp-0D8h]
  00FE14B2 mov ecx, 36h
  00FE14B7 mov eax, 0CCCCCCCCh  ; 填充 0xCC (未初始化內存標記)
  00FE14BC rep stos dword ptr es:[edi]

  int a = 3;
  00FE14BE mov dword ptr [a], 3  ; 將立即數 3 存入 a 的棧地址

  int b;
  b = a;
  00FE14C5 mov eax, dword ptr [a] ; 從 a 地址讀取值至暫存器 eax
  00FE14C8 mov dword ptr [b], eax  ; 將 eax 寫入 b 的棧地址
}

核心步驟

  1. 分配棧空間:sub esp, 0D8h 為局部變量預留內存。
  2. 初始化 a:mov dword ptr [a], 3 直接將常數 3 寫入 a 的棧槽(4 字節)。
  3. 賦值 b = a:
    • mov eax, [a]:從 a 內存讀取 4 字節到通用暫存器 EAX。
    • mov [b], eax:將 EAX 內容寫入 b 的棧槽。

關鍵觀察

  • 同類型賦值本質是 內存到暫存器,再從暫存器到內存 的搬運(load-store)。
  • 編譯器優化(-O2)下可能直接用 mov [b], dword ptr [a](內存到內存)或更激進地傳播常數。
  • 0xCCCCCCCC 是 MSVC Debug 模式填充未初始化棧內存的標記,便於捕獲野指針訪問。

擴展:結構體賦值

結構體賦值同理,編譯器會生成逐字節/逐字拷貝循環或調用 memcpy,視大小與對齊而定。

理解底層機制有助於編寫高性能代碼、排查內存錯誤、逆向分析與嵌入式開發。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved