TL; DR;
“ FS” /“ GS”寄存器的用途是什么?
只需访问默认数据段(DS)之外的数据。就像ES。
长读:
因此,我知道以下寄存器及其用途是什么:
[...]
好吧,但DS几乎不是“某些”数据段,而是默认数据段。默认情况下所有操作都发生(* 1)。这是所有默认变量都位于-本质上data和bss。这是x86代码非常紧凑的部分原因。所有最常用的基本数据(加上代码和堆栈)都在16位速记距离之内。
ES用于访问其他所有内容(* 2),以及DS的64 KiB之外的所有内容。类似于文字处理程序的文本,电子表格的单元格或图形程序的图片数据等。与通常假定的情况不同,该数据的访问量不大,因此使用前缀比使用较长的地址字段所受的伤害小。
类似地,在进行字符串操作时可能必须加载(和重新加载)DS和ES只是一个小麻烦-至少这被其当时最好的字符处理指令集之一所抵消。
真正令人痛心的是,当用户数据超过64 KiB且必须开始操作时。尽管某些操作一次只对单个数据项完成(请考虑A=A*2),但大多数操作需要两个(A=A*B)或三个数据项(A=B*C)。如果这些项目位于不同的段中,则每个操作将重新加载ES几次,从而增加了相当大的开销。
最初,使用来自8位世界(* 3)的小型程序和同样小的数据集,这没什么大不了的,但是它很快就成为了主要的性能瓶颈-尤其是对于程序员(和编译器)。最终,随着386英特尔的加入,英特尔又增加了另外两个段,从而可以进行任何一元,二进制或三元运算,并且元素分布在内存中,而无需始终重新加载ES。
对于编程(至少在汇编中)和编译器设计,这是一个很大的收获。当然,可能还有更多,但是有了三个瓶颈就基本消失了,因此无需过度操作。
明智地将字母F / G命名为E之后的字母连续。至少从CPU设计的角度来看,没有任何关联。
* 1-将ES用于字符串目标是一个例外,因为仅需要两个段寄存器。没有它们就没有太大用处-或始终需要一个段前缀。这可能会杀死令人惊讶的功能之一,即使用(非重复)字符串指令(由于其单字节编码)而导致极高的性能。
* 2-因此,事后看来,“其他所有细分”的命名方式要比“其他细分”更好。
* 3-牢记8086只是在8800完成之前的一个止步措施,始终是非常重要的,它主要用于嵌入式世界,以吸引8080/85客户。