TL; DR;
Sổ đăng ký “FS” / “GS” nhằm mục đích gì?
Đơn giản chỉ để truy cập dữ liệu ngoài phân đoạn dữ liệu mặc định (DS). Chính xác như ES.
Đọc lâu:
Vì vậy, tôi biết những gì các thanh ghi sau và công dụng của chúng được cho là:
[...]
Vâng, gần như nhưng DS không phải là 'một số' Phân đoạn dữ liệu, mà là Phân đoạn mặc định. Tất cả hoạt động đều diễn ra theo mặc định (* 1). Đây là tất cả các biến mặc định được định vị - về cơ bản data
và bss
. Theo một cách nào đó, đó là một phần lý do tại sao mã x86 khá nhỏ gọn. Tất cả dữ liệu thiết yếu, là những gì thường được truy cập nhất, (cộng với mã và ngăn xếp) đều nằm trong khoảng cách viết nhanh 16 bit.
ES được sử dụng để truy cập mọi thứ khác (* 2), mọi thứ ngoài 64 KiB của DS. Giống như văn bản của trình xử lý văn bản, các ô của bảng tính hoặc dữ liệu hình ảnh của chương trình đồ họa, v.v. Không giống như thường được giả định, dữ liệu này không được truy cập nhiều, vì vậy việc cần tiền tố sẽ ít gây tổn hại hơn so với việc sử dụng các trường địa chỉ dài hơn.
Tương tự, đó chỉ là một khó chịu nhỏ mà DS và ES có thể phải được tải (và tải lại) khi thực hiện các hoạt động chuỗi - điều này ít nhất được bù đắp bởi một trong những bộ lệnh xử lý ký tự tốt nhất vào thời điểm đó.
Điều thực sự khó khăn là khi dữ liệu người dùng vượt quá 64 KiB và các hoạt động phải được bắt đầu. Trong khi một số thao tác được thực hiện đơn giản trên một mục dữ liệu tại một thời điểm (nghĩ A=A*2
), hầu hết yêu cầu hai ( A=A*B
) hoặc ba mục dữ liệu ( A=B*C
). Nếu các mục này nằm trong các phân đoạn khác nhau, ES sẽ được tải lại nhiều lần mỗi lần hoạt động, thêm một số chi phí.
Ban đầu, với các chương trình nhỏ từ thế giới 8 bit (* 3) và các tập dữ liệu nhỏ như nhau, đó không phải là vấn đề lớn, nhưng nó nhanh chóng trở thành một cổ chai hiệu suất lớn - và hơn thế nữa là một nỗi đau thực sự đối với lập trình viên (và trình biên dịch). Với 386 Intel cuối cùng giao cứu trợ bằng cách thêm hai đoạn, vì vậy bất kỳ loạt unary , nhị phân hoặc ternary hoạt động, với các yếu tố lây lan ra trong bộ nhớ, có thể xảy ra mà không tải lại ES tất cả các thời gian.
Đối với lập trình (ít nhất là trong lắp ráp) và thiết kế trình biên dịch, đây là một lợi ích khá lớn. Tất nhiên, có thể có nhiều hơn nữa, nhưng với ba cổ chai về cơ bản đã biến mất, vì vậy không cần phải lạm dụng nó.
Đặt tên khôn ngoan, các chữ cái F / G chỉ đơn giản là các chữ cái liên tục sau E. Ít nhất là từ quan điểm thiết kế CPU, không có gì liên quan.
* 1 - Việc sử dụng ES cho đích chuỗi là một ngoại lệ, vì chỉ cần hai thanh ghi phân đoạn là cần thiết. Nếu không có chúng sẽ không hữu ích nhiều - hoặc luôn cần tiền tố phân đoạn. Điều này có thể giết chết một trong những tính năng đáng ngạc nhiên, việc sử dụng các lệnh chuỗi (không lặp lại) dẫn đến hiệu suất cực cao do mã hóa byte đơn của chúng.
* 2 - Vì vậy, trong nhận thức muộn màng, "Mọi thứ khác Phân đoạn" sẽ là một cách đặt tên tốt hơn so với "Phân đoạn bổ sung".
* 3 - Điều quan trọng cần lưu ý là 8086 chỉ được dùng như một thước đo khoảng cách dừng cho đến khi 8800 được hoàn thiện và chủ yếu dành cho thế giới nhúng để giữ chân 8080/85 khách hàng.