Tên đăng ký 'R' trong x64 có nghĩa là gì?


27

Tôi biết các thanh ghi 32 bit được đặt tên giống như các thanh ghi 16 bit có tiền tố 'E' có nghĩa là mở rộng. Tôi luôn cho rằng điều đó có nghĩa là mở rộng từ 16 đến 32 bit mặc dù tôi chưa bao giờ thấy điều đó được nêu rõ ràng.

Tôi đã cố gắng tìm hiểu chữ 'R' là gì nhưng các kỹ năng google của tôi đã làm tôi thất bại. Có ai biết không?


Câu trả lời:


32

Nó có nghĩa là đăng ký , và nó không phải là tất cả vì lý do lịch sử.

Phần lịch sử là Intel có thói quen liệt kê các thanh ghi với các chữ cái có 8008 (A đến E cộng với H và L). Sơ đồ đó là quá đủ vào thời điểm đó vì bộ vi xử lý có rất ít thanh ghi và không có khả năng nhận được nhiều hơn, và hầu hết các thiết kế đã làm điều đó. Tình cảm phổ biến sau đó là phần mềm sẽ được viết lại cho CPU mới khi chúng xuất hiện, do đó thay đổi sơ đồ đặt tên đăng ký giữa các mô hình sẽ không phải là vấn đề lớn. Không ai lường trước được 8088 phát triển thành một "gia đình" sau khi được tích hợp vào PC của IBM và ách thống trị tương thích ngược khá nhiều đã buộc Intel phải áp dụng các sơ đồ như "E" trên các thanh ghi 32 bit để duy trì nó.

Phần phi lịch sử là tất cả thực tế. Sử dụng các chữ cái cho các thanh ghi mục đích chung giới hạn bạn đến 26, ít hơn nếu bạn loại bỏ các ký tự có thể gây nhầm lẫn với tên của các thanh ghi mục đích đặc biệt như bộ đếm chương trình, cờ hoặc con trỏ ngăn xếp.

Tôi không có nguồn để xác nhận nó, nhưng tôi nghi ngờ sự lựa chọn Rlàm tiền tố và giới thiệu R8 đến R15 trên CPU 64 bit báo hiệu sự chuyển đổi sang các thanh ghi được đánh số, là chuẩn mực trong 32 bit - và Kiến trúc lớn hơn không bắt nguồn từ năm 8008 trong gần nửa thế kỷ. IBM đã làm điều đó vào những năm 1960 với 360 và sau đó là PowerPC, DEC Alpha, MIPS, SPARC, ARM, i860 và i960 của Intel và một loạt những người khác bị lãng quên từ lâu.

Bạn sẽ lưu ý rằng các thanh ghi hiện tại sẽ phù hợp với R0 đến R7 nếu chúng tồn tại và nó sẽ không làm tôi ngạc nhiên một chút nếu chúng được xử lý theo cách đó trong nội bộ. Các thanh ghi dài hiện có (RAX / EAX / AX / AL, RBX / EBX / BX / BL, v.v.) có thể sẽ ở xung quanh cho đến khi mặt trời cháy hết.


1
Một chút phản trắc nhưng tôi đoán tôi không nên quá ngạc nhiên. Cảm ơn.
Matt

3
Đó là tất cả những gì tôi có thể tập hợp được. :-)
Blrfl

+1 cho bài đọc rất thú vị. Nhưng nếu nó được tóm tắt chỉ trong một dòng, thì đó sẽ là câu trả lời mà tôi đã đưa ra. Tất cả thông tin phong phú và thú vị này được thu gọn lại thành "lý do lịch sử" nếu được tóm tắt.
Mike Nakis

6
AMD đã xem xét đổi tên hoặc răng cưa 8 thanh ghi thấp đến r0- r7hoặc sử dụng UAXthay vì r8vv . "Tìm ra cách đặt tên tốt nhất cho các thanh ghi thực sự là một trong những phần khó nhất khi thực hiện gia hạn đăng ký." (Xem stackoverflow.com/a/35619528/224132 để biết một số lịch sử x86-64 gọn gàng khác.) Ngoài ra, thứ tự không phải là RAX / RBX / ... trong mã hóa nhị phân, đó là AX, CX, DX, BX
Peter Cordes

9

Trong các bộ xử lý trước đó, không phải tất cả các thanh ghi đều như nhau:

  • Không có đủ dung lượng trên các chip để có một đơn vị cộng cho mỗi thanh ghi.
  • Với 8 bit, không có đủ opcodes cho tất cả các kết hợp nguồn và đích có thể.

Vì vậy, giả sử rằng một thanh ghi cụ thể luôn có liên quan khi bộ cộng có liên quan, làm cho chip ít phức tạp hơn và opcodes ngắn hơn.

Ví dụ: 6510 (được sử dụng trong Hàng hóa 64) chỉ có thể thêm bằng cách sử dụng thanh ghi A và lập chỉ mục được sử dụng X hoặc Y. Có hướng dẫn INC X và INC Y, nhưng không có INC A.

Vì các thanh ghi có cách sử dụng khác nhau, nên việc ghi nhớ được chọn phản ánh cách sử dụng của chúng. Ví dụ: A, X và Y trong 6510 (thay vì A, B và C).

Tên trong 8086 cũng được chọn để phản ánh cách sử dụng của chúng. Với 4 thanh ghi mục đích chung, việc đặt tên cho chúng là AX, BX, CX và DX là hợp lý. Các thanh ghi chỉ mục bổ sung được gọi là BP và SP (mnemonic: Base Pulum, Stack Pulum).

Vì nhiều opcode được mở rộng thành 16 bit, có một khoảng trống để chỉ ra một trong bốn thanh ghi được sử dụng. Tuy nhiên, một số lý do lịch sử vẫn được áp dụng, vì CX hơi đặc biệt: REP và lượt thích, đó là opcodes 8 bit, luôn sử dụng CX làm bộ đếm. Một mnemonic đơn giản, CX = Counter, giúp ghi nhớ cái nào được sử dụng.

Các opcodes cho người kế nhiệm cho 8086 phải tương thích ngược và là một mớ hỗn độn do các opcodes có chiều dài thay đổi. Khi các bus 32 bit trở nên phổ biến hơn, các bộ xử lý có độ dài opcode cố định đã được thử. Điều này giúp đơn giản hóa phần giải mã của CPU, giúp giải phóng không gian có thể được sử dụng cho các thanh ghi khác.

Các bộ xử lý tuân theo dòng suy nghĩ này được gọi là bộ xử lý RISC (CPU Bộ hướng dẫn giảm), để tương phản với CISC (CPU Bộ hướng dẫn phức tạp).

Nhiều thanh ghi hơn dẫn đến ít tràn bộ nhớ hơn. Về cơ bản, các thanh ghi là bộ đệm nhanh nhất có sẵn, vì vậy tăng số lượng thanh ghi là một ý tưởng tốt, ngay cả ngày nay. Việc thiếu các hướng dẫn chuyên ngành (hy vọng nhiều hơn) được bù đắp bằng cách đưa ra các hướng dẫn đơn giản nhanh hơn.

Các opcodes 32 bit có độ dài cố định có đủ không gian để bao gồm nguồn, nguồn thứ hai, hoạt động và đích. SPARC quản lý để vặn 5 bit cho mỗi nguồn, nguồn thứ hai và đích và do đó có 32 thanh ghi hiển thị cùng một lúc.

32 thanh ghi quá nhiều để sử dụng các chữ cái và dù sao chúng cũng gần như bằng nhau, vì vậy đánh số chúng là lựa chọn rõ ràng. 'R' được sử dụng để phân biệt chúng với các hằng số 0..31 và 'R' là một cách ghi nhớ dễ dàng cho Đăng ký. Do đó: R0..R31.

Trong những năm qua, Pentium và những người kế nhiệm của nó đã duy trì sự tương đồng ngược. Tuy nhiên, nhiều ý tưởng RISC thành công hơn cũng được kết hợp. Thông thường, những hướng dẫn mới, giống như RISC sẽ chạy nhanh hơn các phiên bản tương thích ngược.

Số lượng thanh ghi cũng được Intel tăng lên, để giảm số lượng truy cập bộ nhớ.

Và rõ ràng, Intel cuối cùng đã bắt đầu sử dụng ký hiệu R. Khả năng tương thích ngược sẽ đảm bảo rằng AX, BX, ... sẽ ở lại, nhưng tôi cá rằng AX chỉ là một từ đồng nghĩa với ví dụ R0.


Tuyên bố từ chối trách nhiệm : Trên đây là quan điểm của tôi về lịch sử. Nó sẽ không đầy đủ khi tôi không có mặt để chứng kiến ​​những phần trước của lịch sử. Tuy nhiên, tôi hy vọng nó hữu ích cho một số.


1
Gia đình 6500 thực sự không cần một hướng dẫn chuyên dụng để tăng bộ tích lũy bởi vì một chế độ cộng 1 ngay lập tức có hai chu kỳ giống như một INXhoặc INY, mặc dù mã chiếm một byte bổ sung. Tôi đã viết rất nhiều phần lắp ráp cho con chip đó và trong thực tế, loại tăng đó rất hiếm khi làm toán cần nó.
Blrfl

@Blrfl Bạn nói đúng: ADD 1hoạt động nên không cần thiết phải 'Tăng A' chuyên biệt. Và tôi cũng không nhớ là cần nó.
Sjoerd

1
Cần lưu ý rằng không phải Intel đã tăng số lượng đăng ký trong x64 và đặt tên cho chúng, mà là AMD, vì các phần mở rộng 64 bit cho x86 đã được AMD tạo ra . Thiết kế 64 bit của IntelItanium , đã không được thực hiện khá tốt, mặc dù họ đã đặt rất nhiều (128 số nguyên cho mục đích chung, cộng với nhiều số khác) các thanh ghi trong đó.
8bittree

5

Nó chỉ có nghĩa là 'đăng ký'. Vì lý do lịch sử.


Nó không thực sự là lịch sử nếu nó hiện đang đề cập đến một đăng ký, phải không? Tôi muốn nói rằng các tên khác cho các thanh ghi (AX, EAX, v.v.) là nhiều hơn vì lý do lịch sử. Nhưng rằng "R" trong RAX thực sự được áp dụng rất nhiều.
Carl G

1
(+1) meme: "Nếu bạn có thể giải thích nó dài, bạn có thể giải thích nó ngắn."
user7813604
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.