內嵌匯編實現 `Swap2(int &_int1, int &_int2)`,函數內部匯編指令確實交換了數值,但返回後主函數 `a, b` 未變化,彷彿傳值而非傳址。
查看反組合碼:
; Swap2(a, b) 呼叫
lea ecx, [ebp-8] ; a 地址
push ecx
lea edx, [ebp-4] ; b 地址
push edx
call Swap2
`Swap2` 內部匯編操作的是**堆疊上的參數副本地址**,但函數結束時**未將結果寫回原變量記憶體位置**(缺少 `mov [ebp-8], eax` 等寫回指令)。`printf` 讀取的是主函數堆疊框架中的 `a, b`,未被修改。
在匯編塊結束前顯式寫回:
__asm {
mov ebx, [_int1]
xchg ebx, [_int2]
mov [_int1], ebx
; 需額外寫回到呼叫者堆疊位置,或改用指針參數
}
更穩健做法:**避免在內嵌匯編中直接操作 C++ 參數**,改用局部變量暫存,函數結束前賦值回參考參數,或直接用 C++ 寫 `std::swap`。