TL; DR;
Untuk apa register "FS" / "GS"?
Cukup untuk mengakses data di luar segmen data default (DS). Persis seperti ES.
Baca Panjang:
Jadi saya tahu register berikut apa dan penggunaannya seharusnya:
[...]
Yah, hampir tetapi DS bukanlah 'beberapa' Segmen Data, tetapi yang default. Apakah semua operasi berlangsung secara default (* 1). Ini adalah semua variabel default berada - pada dasarnya data
dan bss
. Ini dalam beberapa hal merupakan alasan mengapa kode x86 agak kompak. Semua data penting, yang paling sering diakses, (plus kode dan tumpukan) berada dalam jarak singkat 16 bit.
ES digunakan untuk mengakses segala sesuatu yang lain (* 2), segala sesuatu di luar 64 KiB DS. Seperti teks dari pengolah kata, sel dari lembar kerja, atau data gambar dari program grafik dan seterusnya. Tidak seperti yang sering diasumsikan, data ini tidak banyak diakses, jadi membutuhkan prefiks tidak terlalu menyakitkan daripada menggunakan bidang alamat yang lebih panjang.
Serupa, itu hanya gangguan kecil bahwa DS dan ES mungkin harus dimuat (dan dimuat ulang) saat melakukan operasi string - ini setidaknya diimbangi oleh salah satu set instruksi penanganan karakter terbaik pada masanya.
Yang benar-benar menyakitkan adalah ketika data pengguna melebihi 64 KiB dan operasi harus dimulai. Sementara beberapa operasi hanya dilakukan pada satu item data pada satu waktu (pikirkan A=A*2
), kebanyakan memerlukan dua ( A=A*B
) atau tiga item data ( A=B*C
). Jika item ini berada di segmen yang berbeda, ES akan dimuat ulang beberapa kali per operasi, menambahkan beberapa overhead.
Pada awalnya, dengan program kecil dari dunia 8 bit (* 3) dan set data yang sama kecilnya, itu bukan masalah besar, tetapi segera menjadi leher botol kinerja utama - dan lebih dari itu rasa sakit yang sebenarnya di pantat untuk programmer (dan kompiler). Dengan 386 Intel akhirnya memberikan bantuan dengan menambahkan dua segmen lagi, jadi setiap seri unary , binary atau ternary , dengan elemen yang tersebar di memori, dapat berlangsung tanpa memuat ulang ES sepanjang waktu.
Untuk pemrograman (setidaknya dalam perakitan) dan desain kompiler, ini cukup menguntungkan. Tentu saja, mungkin ada lebih banyak lagi, tetapi dengan tiga leher botol pada dasarnya sudah hilang, jadi tidak perlu berlebihan.
Penamaan bijaksana huruf F / G hanyalah lanjutan alfabet setelah E. Setidaknya dari sudut desain CPU tidak ada yang terkait.
* 1 - Penggunaan ES untuk tujuan string merupakan pengecualian, karena hanya diperlukan dua register segmen. Tanpa mereka tidak akan banyak berguna - atau selalu membutuhkan awalan segmen. Yang dapat mematikan salah satu fitur yang mengejutkan, penggunaan instruksi string (tidak berulang) yang menghasilkan kinerja ekstrim karena pengkodean byte tunggal mereka.
* 2 - Jadi kalau dipikir-pikir, 'Segmen Lain-Lain' akan menjadi penamaan yang jauh lebih baik daripada 'Segmen Tambahan'.
* 3 - Selalu penting untuk diingat bahwa 8086 hanya dimaksudkan sebagai pengukur celah berhenti sampai 8800 diselesaikan dan terutama ditujukan untuk dunia tertanam untuk mempertahankan 8080/85 pelanggan.