棧是一塊連續內存,以 4 字節為單位劃分。ESP 永遠指向棧頂,棧從高地址向低地址增長。
ESP -= 4,數據寫入新棧頂ESP += 4| 指令 | 作用 | 示例 |
|---|---|---|
| MOV A,B | A = B | MOV EAX, 10 |
| SUB A,B | A = A - B | SUB EAX, 10 |
| LEA A,B | A = &B | LEA EDI, val |
| REP STOS DWORD PTR [EDI] | 將 EAX 循環寫入 EDI 指向內存,ECX 次,EDI+4 | 初始化數組 |
| PUSH A | 入棧 | PUSH EAX |
| POP A | 出棧 | POP EAX |
| CALL FUN | 調用函數,壓入返回地址 (EIP) | CALL swap |
| RET | 返回,彈出 EIP | RET |
void swap(int a, int b) { // 形參為副本
int tem = a; a = b; b = tem;
}
int main() {
int a=1, b=2;
swap(a,b); // 實參值拷貝給形參,函數內交換無法影響外部
return 0;
}
視頻演示棧幀變化:調用 swap 時,實參 1,2 壓棧,形參在棧幀中佔據獨立位置,函數返回前棧幀銷毀,交換僅發生在臨時副本上。
void swap(int *pa, int *pb) { // 傳遞地址
int tem = *pa; *pa = *pb; *pb = tem;
}
int main() {
int a=1, b=2;
swap(&a, &b); // 傳入變量地址,函數通過解引用修改原變量
return 0;
}
核心差異:值傳遞複製數據,指針傳遞複製地址。通過地址可跨棧幀訪問並修改原變量,這是指針在函數參數中最經典的用武之地。