TL; DR;
"FS"/ "GS"레지스터의 용도는 무엇입니까?
기본 데이터 세그먼트 (DS)를 넘어서 데이터에 액세스하기 만하면됩니다. ES와 똑같습니다.
긴 읽기 :
그래서 다음 레지스터와 그 용도가 무엇인지 알고 있습니다.
[...]
글쎄, 거의 DS는 '일부'데이터 세그먼트가 아니라 기본 데이터 세그먼트입니다. 기본적으로 모든 작업이 수행 되었습니까 (* 1). 이것은 기본적으로 data
및 bss
. x86 코드가 다소 간결한 이유의 일부입니다. 가장 자주 액세스되는 모든 필수 데이터 (코드 및 스택 포함)는 16 비트 단축 거리 내에 있습니다.
ES는 64KiB의 DS를 초과하는 모든 것 (* 2)에 액세스하는 데 사용됩니다. 워드 프로세서의 텍스트, 스프레드 시트의 셀, 그래픽 프로그램의 그림 데이터 등과 같습니다. 흔히 가정하는 것과 달리이 데이터는 많이 액세스되지 않으므로 접두사가 필요한 것은 긴 주소 필드를 사용하는 것보다 덜 아프다.
유사하게 문자열 연산을 수행 할 때 DS와 ES를로드 (및 다시로드)해야 할 수있는 사소한 성가심 일뿐입니다. 이것은 적어도 당시 최고의 문자 처리 명령어 세트 중 하나에 의해 오프셋됩니다.
정말 아픈 것은 사용자 데이터가 64KiB를 초과하고 작업을 시작해야 할 때입니다. 일부 작업은 한 번에 하나의 데이터 항목에 대해 간단히 수행되지만 (생각해보십시오 A=A*2
) 대부분의 경우 2 개 ( A=A*B
) 또는 3 개의 데이터 항목 ( A=B*C
)이 필요합니다. 이러한 항목이 다른 세그먼트에 있으면 ES가 작업 당 여러 번 다시로드되어 상당한 오버 헤드가 추가됩니다.
처음에는 8 비트 세계 (* 3)의 작은 프로그램과 똑같이 작은 데이터 세트를 사용하여 큰 문제는 아니었지만 곧 주요 성능 병목이되었습니다. 프로그래머 (및 컴파일러). 386을 통해 Intel은 마침내 두 개의 세그먼트를 더 추가하여 안심을 제공했습니다. 따라서 요소가 메모리에 분산 되어있는 모든 시리즈 단항 , 이진 또는 삼항 연산은 항상 ES를 다시로드하지 않고도 수행 할 수 있습니다.
프로그래밍 (적어도 어셈블리에서) 및 컴파일러 디자인의 경우 이것은 상당한 이득이었습니다. 물론 더 많을 수도 있었지만 3 개를 사용하면 기본적으로 병목이 없어 졌으므로 과도하게 사용할 필요가 없습니다.
현명하게 이름을 짓는 문자 F / G는 E 뒤의 알파벳 연속입니다. 적어도 CPU 설계 시점에서는 아무 관련이 없습니다.
* 1-단순히 두 개의 세그먼트 레지스터가 필요하므로 ES를 문자열 대상으로 사용하는 것은 예외입니다. 없이는 그다지 유용하지 않거나 항상 세그먼트 접두사가 필요합니다. 놀라운 기능 중 하나를 죽일 수 있습니다. (반복적이지 않은) 문자열 명령어를 사용하면 단일 바이트 인코딩으로 인해 최고의 성능을 얻을 수 있습니다.
* 2-돌이켜 보면 'Everything Else Segment'는 'Extra Segment'보다 이름을 더 잘 지정했을 것입니다.
* 3-8086 은 8800 이 완성 될 때까지 스톱 갭 측정 용으로 만 사용 되었으며 주로 임베디드 세계에서 8080/85 고객을 유지하기위한 것임을 기억하는 것이 항상 중요합니다 .