programing

원점수와 근점수의 차이점은 무엇입니까?

goodcopy 2022. 7. 23. 13:33
반응형

원점수와 근점수의 차이점은 무엇입니까?

다른 요?far 및 「」를 참조.near【C】【C】【C】【C】【C】?

16비트 x86 세그먼트메모리 아키텍처에서는 각 세그먼트를 참조하기 위해 4개의 레지스터가 사용됩니다.

  • DS → 데이터 세그먼트
  • CS → 코드 세그먼트
  • SS → 스택 세그먼트
  • ES → 추가 세그먼트

는 「아키텍처」라고 있습니다.segment:offset이치노

  • 근접 포인터는 (오프셋으로) 현재 세그먼트를 참조합니다.

  • 원점 포인터는 세그먼트 정보와 오프셋을 사용하여 세그먼트를 가리킵니다.따라서 DS 또는 CS를 사용하려면 DS 또는 CS를 지정된 값으로 변경하고 메모리를 참조 해제한 후 DS/CS의 원래 값을 복원해야 합니다.포인터 산술에서는 포인터의 세그먼트 부분이 수정되지 않으므로 오프셋이 오버플로우되어도 포인터를 감쌀 수 있습니다.

  • 또, 큰 포인터도 있습니다.이것은, 특정의 주소(원점 포인터와는 반대로)에 대해서 가능한 최고의 세그먼트(segment)를 가지는 정규화 되어 있습니다.

32비트 및 64비트 아키텍처에서는 메모리 모델이 세그먼트를 다르게 사용하거나 전혀 사용하지 않습니다.

DOS에 대해서는 아무도 언급하지 않았기 때문에 오래된 DOS PC는 잊고 일반적인 관점에서 살펴봅시다.그 후, 매우 심플하게, 다음과 같습니다.


모든 CPU에는 데이터 버스가 있습니다.이것은 CPU가 1개의 명령으로 처리할 수 있는 최대 데이터량, 즉 레지스터의 크기와 동일합니다.데이터 버스 폭은 8비트, 16비트 또는 64비트 등으로 표시됩니다.64비트 CPU라는 용어는 여기서 유래합니다.데이터 버스를 의미합니다.

모든 CPU에는 주소 버스가 있으며, 특정 버스 폭도 비트로 표시됩니다.CPU가 직접 액세스할 수 있는 컴퓨터의 메모리 셀에는 고유한 주소가 있습니다.주소 버스는 가지고 있는 모든 주소 지정 가능 메모리를 커버할 수 있을 만큼 충분히 큽니다.

예를 들어 컴퓨터에 65536바이트의 주소 지정 가능한 메모리가 있는 경우 16비트 주소 버스(2^16 = 65536)로 처리할 수 있습니다.

데이터 버스 폭은 주소 버스 폭만큼 넓어지는 경우가 대부분이지만 항상 있는 것은 아닙니다.같은 사이즈의 CPU 명령어 세트와 그 명령어용 프로그램을 명확하게 할 수 있기 때문에 좋습니다.CPU가 주소를 계산할 필요가 있는 경우는, 그 주소가 CPU 레지스터(주소에 대해서는 인덱스 레지스터라고 불립니다)에 들어갈 정도로 작은 것이 편리합니다.

키워드 " " "far ★★★★★★★★★★★★★★★★★」near는, 할가 있는 포인터를 사용합니다.

예를 들어, 16비트 데이터 버스가 있는 CPU에는 16비트 주소 버스도 있는 것이 편리할 수 있습니다.그러나 동일한 컴퓨터에는 2^16 = 65536 바이트 = 64kB 이상의 주소 지정 가능 메모리가 필요할 수도 있습니다.

CPU는 보통 64KB 이상의 메모리를 주소 지정할 수 있는 특별한 명령(약간 느림)을 갖게 됩니다.들어 를 CPU로 할 수 .n 페이지(뱅크, 세그먼트 및 기타 용어라고도 불리며 CPU마다 다른 것을 의미할 수 있음)입니다.여기서 각 페이지는 64kB입니다.그런 다음 확장 메모리에 주소를 지정하기 전에 먼저 설정해야 하는 "페이지" 레지스터가 있습니다.마찬가지로 확장 메모리의 서브 루틴에서 호출/돌아가면 특별한 명령이 있습니다.

메모리를 할 때 C는 를 사용합니다.near ★★★★★★★★★★★★★★★★★」far이치노에서와 같은 비표준은 C 표준으로 지정되어 있지 않지만 사실상의 업계 표준이며 거의 모든 컴파일러가 어떤 식으로든 이들을 지원합니다.

far는, 버스의 확장 에 있는 를 가리킵니다.주소를 가리키기 때문에 포인터를 선언할 때 사용하는 경우가 대부분입니다.를 들면, '먹다'와 같이요.int * far x;는 "확장 메모리를 가리키는 포인터를 주세요"를 의미합니다.그 후 컴파일러는 이러한 메모리에 액세스하기 위해 필요한 특별한 명령을 생성해야 한다는 것을 알게 됩니다. " ", "를 사용하는 "far는 확장 메모리에서 점프/돌아가기 위한 특별한 명령을 생성합니다. if if if if if if if if if if if if 。far그러면 보통, 주소 지정 가능한 메모리에 대한 포인터를 얻을 수 있고, 결국 완전히 다른 것을 가리키게 됩니다.

near주로 와의 일관성을 위해 포함되어 있다.far어드레스 가능한 메모리내의 임의의 것을 통상의 포인터와 동등하게 나타냅니다.따라서 이 키워드는 주로 쓸모없는 키워드입니다.단, 코드를 표준 주소 지정 가능한 메모리 내에 배치해야 하는 드문 경우가 있습니다. 다음, 것을 붙일 수 .near가장 일반적인 경우는 인터럽트 서비스 루틴을 쓰는 저수준 하드웨어 프로그래밍입니다.주소 버스 폭과 같은 고정 폭의 인터럽트 벡터에서 하드웨어에 의해 호출됩니다.이 표준 가능 메모리에 합니다.


far ★★★★★★★★★★★★★★★★★」near는 아마도 언급된 오래된 MS DOS PC일 것입니다.이 PC는 현재 상당히 오래된 것으로 간주되고 있기 때문에 약간의 관심이 있습니다.

그러나 이러한 키워드는 보다 현대적인 CPU에도 존재합니다.가장 주목되는 것은 시판되는 8비트 및 16비트 마이크로컨트롤러 패밀리 거의 모든 임베디드 시스템에서 마이크로컨트롤러는 일반적으로 16비트이지만 때로는 64kB 이상의 메모리를 가지고 있기 때문입니다.

할 는, , 「CPU」가 합니다.」가 .far ★★★★★★★★★★★★★★★★★」near그러나 일반적으로 이러한 솔루션은 프로그램하는 것은 매우 귀찮고 항상 확장 메모리를 고려하기 때문에 눈살을 찌푸리게 됩니다.

64비트 PC의 개발이 추진된 주요 이유 중 하나는 32비트 PC의 메모리 사용량이 주소 버스 한계에 도달하기 시작한 시점이었기 때문입니다. 즉, RAM은 4GB밖에 다루지 못했습니다. 2^32 = 4290억 바이트 = 4GB입니다.RAM을 더 많이 사용하기 위해서는 DOS 시절처럼 부담이 큰 확장 메모리 솔루션에 의존하거나 주소 버스를 포함한 컴퓨터를 64비트로 확장하는 방법이 선택되었습니다.

원근 포인터와 근근 포인터는 DOS와 같은 오래된 플랫폼에서 사용되었습니다.

최신 플랫폼에서는 관련이 없는 것 같습니다., 여기와 여기(다른 답변이 지적한 바와 같이)에서 학습할 수 있습니다.기본적으로, 원점 포인터는 컴퓨터에서 주소 지정 가능한 메모리를 확장하는 방법입니다.즉, 16비트 플랫폼에서 64k 이상의 메모리를 사용할 수 있습니다.

포인터는 기본적으로 주소를 유지합니다.아시다시피 인텔의 메모리 관리는 4개의 세그먼트로 나뉩니다.따라서 포인터가 가리키는 주소가 같은 세그먼트 내에 있는 경우, 이는 근접 포인터이므로 오프셋에 필요한 것은 2바이트뿐입니다.한편, 포인터가 세그먼트(즉, 다른 세그먼트)를 벗어난 주소를 가리키고 있는 경우는, 그 포인터는 먼 포인터가 됩니다.4바이트(세그먼트용 2바이트, 오프셋용 2바이트)로 구성됩니다.

4개의 레지스터는 16비트 x86 세그먼트메모리 아키텍처의 4개의 세그먼트를 참조하기 위해 사용됩니다.DS(데이터 세그먼트), CS(코드 세그먼트), SS(스택 세그먼트), ES(엑스트라 세그먼트).이 플랫폼의 논리 주소는 segment: offset(16진수)이라고 쓰여 있습니다.

근접 포인터는 (오프셋으로) 현재 세그먼트를 참조합니다.

원점 포인터는 세그먼트 정보와 오프셋을 사용하여 세그먼트를 가리킵니다.따라서 DS 또는 CS를 사용하려면 DS 또는 CS를 지정된 값으로 변경하고 메모리를 참조 해제한 후 DS/CS의 원래 값을 복원해야 합니다.포인터 산술에서는 포인터의 세그먼트 부분이 수정되지 않으므로 오프셋이 오버플로우되어도 포인터를 감쌀 수 있습니다.

또, 큰 포인터도 있습니다.이것은, 특정의 주소(원점 포인터와는 반대로)에 대해서 가능한 최고의 세그먼트(segment)를 가지는 정규화 되어 있습니다.

32비트 및 64비트 아키텍처에서는 메모리 모델이 세그먼트를 다르게 사용하거나 전혀 사용하지 않습니다.

DOS에서는 레지스터를 다루는 것이 좀 웃겼어.세그먼트(Segments)도 있습니다.RAM의 최대 카운트 용량에 관한 모든 것.

오늘날 그것은 거의 무관하다.가상/사용자 공간 및 커널에 대한 차이만 읽으면 됩니다.

win nt4(*nix에서 아이디어를 훔쳤을 때) 이후 마이크로소프트 프로그래머들은 사용자/커널 메모리 공간을 사용하기 시작했습니다.그 후 물리 컨트롤러에 직접 접속하는 것을 피했습니다.그 후 메모리 세그먼트에 대한 직접 액세스에 관한 문제도 해소되었습니다.- OS를 통해 모든 것이 R/W가 되었습니다.

단, 원근접 포인터를 이해하고 조작할 필요가 있는 경우는 Linux 커널 소스와 그 동작 방법을 살펴보십시오.새로운 것이 돌아오게 될 것입니다.

또, DOS 로 CS(코드 세그먼트)/DS(데이터 세그먼트)를 사용할 필요가 있는 경우.이것 좀 봐.

https://en.wikipedia.org/wiki/Intel_Memory_Model http://www.digitalmars.com/ctg/ctgMemoryModel.html

아래의 완벽한 답변을 지적하고 싶습니다.룬딘에서.나는 너무 게을러서 제대로 대답하지 못했다.룬딘은 "엄지손가락 위로"라는 매우 자세하고 합리적인 설명을 했어요!

언급URL : https://stackoverflow.com/questions/1749904/what-is-the-difference-between-far-pointers-and-near-pointers

반응형