Mã mà bạn tìm thấy cố gắng giải thích cách phần cứng máy tính rất sơ khai có thể triển khai lệnh "thêm". Tôi nói "sức mạnh" vì tôi có thể đảm bảo rằng này phương pháp không được sử dụng bởi bất kỳ CPU, và tôi sẽ giải thích lý do tại sao.
Trong cuộc sống bình thường, bạn sử dụng số thập phân và bạn đã học cách cộng chúng: Để cộng hai số, bạn thêm hai chữ số thấp nhất. Nếu kết quả nhỏ hơn 10, bạn ghi kết quả và chuyển sang vị trí chữ số tiếp theo. Nếu kết quả từ 10 trở lên, bạn ghi kết quả trừ đi 10, chuyển sang chữ số tiếp theo, mua về bạn nhớ cộng thêm 1 nữa. Ví dụ: 23 + 37, bạn thêm 3 + 7 = 10, bạn viết bớt 0 và nhớ thêm 1 nữa cho vị trí tiếp theo. Ở vị trí 10s, bạn thêm (2 + 3) + 1 = 6 và viết nó ra. Kết quả là 60.
Bạn có thể làm điều tương tự với số nhị phân. Sự khác biệt là các chữ số duy nhất là 0 và 1, do đó, các tổng duy nhất có thể là 0, 1, 2. Đối với số 32 bit, bạn sẽ xử lý vị trí một chữ số sau chữ số kia. Và đó là cách phần cứng máy tính thực sự thô sơ sẽ làm điều đó.
Mã này hoạt động khác. Bạn biết tổng của hai chữ số nhị phân là 2 nếu cả hai chữ số đều là 1. Vì vậy, nếu cả hai chữ số đều là 1 thì bạn sẽ thêm 1 nữa ở vị trí nhị phân tiếp theo và viết ra 0. Đó là cách tính t thực hiện: Nó tìm tất cả các vị trí trong đó cả hai chữ số nhị phân là 1 (đó là &) và chuyển chúng sang vị trí chữ số tiếp theo (<< 1). Sau đó, nó thực hiện phép cộng: 0 + 0 = 0, 0 + 1 = 1, 1 + 0 = 1, 1 + 1 là 2, nhưng chúng ta viết ra 0. Đó là những gì toán tử loại trừ hoặc toán tử thực hiện.
Nhưng tất cả số 1 mà bạn phải xử lý ở vị trí chữ số tiếp theo vẫn chưa được xử lý. Chúng vẫn cần được thêm vào. Đó là lý do tại sao đoạn mã thực hiện một vòng lặp: Trong lần lặp tiếp theo, tất cả các số 1 thừa được thêm vào.
Tại sao không có bộ xử lý nào làm theo cách đó? Bởi vì nó là một vòng lặp và bộ xử lý không thích các vòng lặp, và nó chậm. Nó chậm, vì trong trường hợp xấu nhất, cần 32 lần lặp: Nếu bạn thêm 1 vào số 0xffffffff (32 bit 1), thì lần lặp đầu tiên xóa bit 0 của y và đặt x thành 2. Lần lặp thứ hai xóa bit 1 của y và đặt x thành 4. Và cứ thế. Cần 32 lần lặp để có kết quả. Tuy nhiên, mỗi lần lặp phải xử lý tất cả các bit của x và y, điều này tốn rất nhiều phần cứng.
Một bộ xử lý nguyên thủy sẽ thực hiện mọi việc nhanh chóng như cách bạn thực hiện số học thập phân, từ vị trí thấp nhất đến cao nhất. Nó cũng cần 32 bước, nhưng mỗi bước xử lý chỉ hai bit cộng với một giá trị từ vị trí bit trước đó, vì vậy nó dễ thực hiện hơn nhiều. Và ngay cả trong một máy tính nguyên thủy, người ta có thể đủ khả năng làm điều này mà không cần phải thực hiện các vòng lặp.
Một CPU hiện đại, nhanh và phức tạp sẽ sử dụng "bộ cộng tổng có điều kiện". Đặc biệt nếu số lượng bit nhiều, ví dụ bộ cộng 64 bit, nó tiết kiệm rất nhiều thời gian.
Bộ cộng 64 bit bao gồm hai phần: Đầu tiên, bộ cộng 32 bit cho 32 bit thấp nhất. Bộ cộng 32 bit đó tạo ra một tổng và một "mang" (một chỉ báo rằng số 1 phải được thêm vào vị trí bit tiếp theo). Thứ hai, hai bộ cộng 32 bit cho 32 bit cao hơn: Một bộ thêm x + y, bộ còn lại thêm x + y + 1. Cả ba bộ cộng hoạt động song song. Sau đó, khi bộ cộng đầu tiên tạo ra giá trị mang nó, CPU chỉ cần chọn một trong hai kết quả x + y hoặc x + y + 1 là kết quả chính xác và bạn có kết quả hoàn chỉnh. Vì vậy, bộ cộng 64 bit chỉ mất một chút thời gian dài hơn một chút so với bộ cộng 32 bit, không dài gấp đôi.
Các phần bộ cộng 32 bit lại được triển khai dưới dạng bộ cộng tổng có điều kiện, sử dụng nhiều bộ cộng 16 bit và bộ cộng 16 bit là bộ cộng tổng có điều kiện, v.v.
add
lệnh máy gốc , mà tôi đoán tất cả CPU đều có và được triển khai dưới dạng bộ cộng phần cứng hoạt động trong một vài đồng hồ.