Nguồn: The Old New Thing - Microsoft Dev Blogs

Tóm tắt

Raymond Chen trong blog “The Old New Thing” giải thích tại sao xor eax, eax là idiom chuẩn để zeroing một register trong assembly x86, thay vì dùng sub eax, eax — dù cả hai đều cho kết quả bằng 0. Về mặt toán học, eax XOR eax = 0eax - eax = 0 là tương đương, nhưng CPU xử lý chúng khác nhau ở cấp độ vi kiến trúc.

Sự khác biệt quan trọng nằm ở dependency breaking: CPU hiện đại sử dụng kỹ thuật rename registers để thực thi lệnh song song (out-of-order execution). Khi CPU thấy xor reg, reg, nó nhận ra đây là pattern đặc biệt — giá trị kết quả không phụ thuộc vào giá trị hiện tại của register. CPU có thể “break” dependency chain và tạo ra một register mới với giá trị 0 ngay lập tức, không cần chờ vòng lặp thực thi trước đó hoàn thành.

Với sub reg, reg, một số vi kiến trúc cũ không nhận dạng được pattern này, tức là CPU vẫn coi lệnh như phụ thuộc vào giá trị register trước đó, gây ra stall trong pipeline. Ngoài ra, xor reg, reg còn có ưu điểm là không đặt các flag CF và OF (trên x86 modern), điều mà sub thực sự thay đổi.

Đây là ví dụ điển hình về cách hardware design ảnh hưởng đến software convention: một idiom trông có vẻ tùy tiện lại có nền tảng kỹ thuật sâu sắc. Các compiler hiện đại như GCC và Clang đều tự động emit xor thay vì sub khi cần zeroing register trong các đoạn code hot path.

👉 Đọc bài gốc