Hầu hết nội dung của câu trả lời này ban đầu đến từ câu trả lời này (được viết trước đó rằng câu hỏi khác được đánh dấu là trùng lặp). Vì vậy, tôi thảo luận về việc sử dụng các giá trị 8 bit (mặc dù câu hỏi này hỏi về các giá trị 32 bit), nhưng điều đó không sao vì các giá trị 8 bit đơn giản hơn để hiểu về khái niệm và các khái niệm tương tự áp dụng cho các giá trị lớn hơn như số học 32 bit.
Khi bạn thêm hai số là 8 bit, số lớn nhất bạn có thể nhận được (0xFF + 0xFF = 1FE). Trong thực tế, nếu bạn nhân hai số là 8 bit, số lớn nhất bạn có thể nhận được (0xFF * 0xFF = 0xFE01) vẫn là 16 bit, gấp đôi 8 bit.
Bây giờ, bạn có thể giả sử rằng bộ xử lý x-bit chỉ có thể theo dõi các bit x. (Ví dụ: bộ xử lý 8 bit chỉ có thể theo dõi 8 bit.) Điều đó không chính xác. Bộ xử lý 8 bit nhận dữ liệu trong các khối 8 bit. (Các "khối" này thường có một thuật ngữ chính thức: "từ". Trên bộ xử lý 8 bit, các từ 8 bit được sử dụng. Trên bộ xử lý 64 bit, có thể sử dụng các từ 64 bit.)
Vì vậy, khi bạn cung cấp cho máy tính 3 byte:
Byte # 1: Lệnh MUL
Byte # 2: byte thứ tự cao (ví dụ: 0xA5)
Byte # 3: byte thứ tự thấp hơn (ví dụ: 0xCB)
Máy tính có thể tạo ra kết quả là hơn 8 bit. CPU có thể tạo ra kết quả như thế này:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
aka:
0x4082xxxxD7
Bây giờ, hãy để tôi giải thích rằng với bạn:
0x chỉ có nghĩa là các chữ số sau là thập lục phân.
Tôi sẽ thảo luận về "40" chi tiết hơn trong giây lát.
82 là một phần của thanh ghi "A", là một chuỗi gồm 8 bit.
xx và xx là một phần của hai thanh ghi khác, được đặt tên là thanh ghi "B" và thanh ghi "C". Lý do tôi không điền vào các bit đó bằng số 0 hoặc số đó là vì lệnh "THÊM" (được gửi tới CPU) có thể dẫn đến các bit đó không bị thay đổi bởi lệnh (trong khi hầu hết các bit khác tôi sử dụng trong ví dụ này có thể được thay đổi, ngoại trừ một số bit cờ).
D7 sẽ phù hợp với nhiều bit hơn, được gọi là thanh ghi "D".
Một thanh ghi chỉ là một phần của bộ nhớ. Các thanh ghi được tích hợp vào CPU, vì vậy CPU có thể truy cập các thanh ghi mà không cần phải tương tác với bộ nhớ trên thanh RAM.
Vậy kết quả toán học của 0xA5 lần 0xCB là 0x82D7.
Bây giờ, tại sao các bit được chia thành các thanh ghi A và D thay vì các thanh ghi A và B, hoặc các thanh ghi C và D? Chà, một lần nữa, đây là một kịch bản mẫu mà tôi đang sử dụng, có nghĩa là khá giống với ngôn ngữ hội thực sự (Intel x86 16 bit, như được sử dụng bởi Intel 8080 và 8088 và nhiều CPU mới hơn). Có thể có một số quy tắc phổ biến, chẳng hạn như thanh ghi "C" thường được sử dụng làm chỉ mục cho các hoạt động đếm (điển hình cho các vòng lặp) và thanh ghi "B" được sử dụng để theo dõi các offset giúp chỉ định vị trí bộ nhớ. Vì vậy, "A" và "D" có thể phổ biến hơn đối với một số hàm số học phổ biến.
Mỗi hướng dẫn CPU nên có một số tài liệu, được sử dụng bởi những người lập trình trong hội. Tài liệu đó nên chỉ định những thanh ghi nào được sử dụng bởi mỗi hướng dẫn. (Vì vậy, sự lựa chọn về việc sử dụng các thanh ghi nào thường được chỉ định bởi các nhà thiết kế CPU, chứ không phải các lập trình viên ngôn ngữ hội. Mặc dù, có thể có một số linh hoạt.)
Bây giờ, quay trở lại "40" trong ví dụ trên: đó là một chuỗi các bit, thường được gọi là "thanh ghi cờ". Mỗi bit trong thanh ghi cờ có một tên. Ví dụ, có một bit "tràn" mà CPU có thể đặt nếu kết quả lớn hơn không gian có thể lưu trữ một byte kết quả. (Bit "tràn" thường có thể được gọi bằng tên viết tắt là "OF". Đó là chữ hoa o, không phải số không.) Phần mềm có thể kiểm tra giá trị của cờ này và nhận thấy "vấn đề". Làm việc với bit này thường được xử lý vô hình bằng các ngôn ngữ cấp cao hơn, vì vậy các lập trình viên mới bắt đầu thường không tìm hiểu về cách tương tác với các cờ CPU. Tuy nhiên, các lập trình viên hội có thể thường truy cập vào một số các cờ này theo cách rất giống với các biến khác.
Ví dụ, bạn có thể có nhiều hướng dẫn THÊM. Một lệnh ADD có thể lưu 16 bit kết quả trong thanh ghi A và thanh ghi D, trong khi một lệnh khác có thể chỉ lưu 8 bit thấp trong thanh ghi A, bỏ qua thanh ghi D và chỉ định bit tràn. Sau đó, sau đó (sau khi lưu kết quả của thanh ghi A vào RAM chính), bạn có thể sử dụng một lệnh ADD khác chỉ lưu trữ 8 bit cao trong một thanh ghi (có thể là thanh ghi A.) Bạn có cần sử dụng cờ tràn không phụ thuộc vào chỉ số nhân mà bạn sử dụng.
(Thường có một cờ "underflow", trong trường hợp bạn trừ quá nhiều để phù hợp với kết quả mong muốn.)
Chỉ để cho bạn thấy mọi thứ phức tạp như thế nào:
Intel 4004 là CPU 4 bit
Intel 8008 là CPU 8 bit. Nó có các thanh ghi 8 bit có tên A, B, C và D.
Intel 8086 là CPU 16 bit. Nó có các thanh ghi 16 bit có tên AX, BX, CX và DX.
Intel 80386 là CPU 32 bit. Nó có các thanh ghi 32 bit có tên EAX, EBX, ECX và EDX.
Các CPU Intel x64 có các thanh ghi 64 bit có tên RAX, RBX, RCX và RDX. Các chip x64 có thể chạy mã 16 bit (trong một số chế độ hoạt động) và có thể diễn giải các hướng dẫn 16 bit. Khi làm như vậy, các bit tạo nên thanh ghi AX là một nửa số bit tạo nên thanh ghi EAX, là một nửa số bit tạo nên thanh ghi RAX. Vì vậy, bất cứ khi nào bạn thay đổi giá trị của AX, bạn cũng thay đổi EAX và RAX, bởi vì các bit được sử dụng bởi AX là một phần của các bit được sử dụng bởi RAX. (Nếu bạn thay đổi EAX theo giá trị là bội số của 65,536, thì 16 bit thấp không thay đổi để AX sẽ không thay đổi. Nếu bạn thay đổi EAX theo giá trị không phải là bội số của 65.536, thì điều đó cũng sẽ ảnh hưởng đến AX .)
Có nhiều cờ và đăng ký hơn chỉ những cái mà tôi đã đề cập. Tôi chỉ đơn giản chọn một số thường được sử dụng để cung cấp một ví dụ khái niệm đơn giản.
Bây giờ, nếu bạn đang sử dụng CPU 8 bit, khi bạn ghi vào bộ nhớ, bạn có thể thấy một số hạn chế về việc có thể tham chiếu địa chỉ 8 bit, không phải địa chỉ 4 bit hoặc 16 bit. Các chi tiết sẽ thay đổi dựa trên CPU, nhưng nếu bạn có những hạn chế như vậy, thì CPU có thể xử lý các từ 8 bit, đó là lý do tại sao CPU thường được gọi là "CPU 8 bit".