看似簡單的 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 的棧地址
}
sub esp, 0D8h 為局部變量預留內存。mov dword ptr [a], 3 直接將常數 3 寫入 a 的棧槽(4 字節)。mov eax, [a]:從 a 內存讀取 4 字節到通用暫存器 EAX。mov [b], eax:將 EAX 內容寫入 b 的棧槽。mov [b], dword ptr [a](內存到內存)或更激進地傳播常數。0xCCCCCCCC 是 MSVC Debug 模式填充未初始化棧內存的標記,便於捕獲野指針訪問。結構體賦值同理,編譯器會生成逐字節/逐字拷貝循環或調用 memcpy,視大小與對齊而定。
理解底層機制有助於編寫高性能代碼、排查內存錯誤、逆向分析與嵌入式開發。