2017-09-13 16 views
0

인텔의 커다란 매뉴얼을 읽으면서 원거리에서 돌아오고 싶다면 다른 코드 세그먼트에있는 프로 시저에 대한 호출 인 경우 반환 명령을 내리면됩니다 (스택 포인터를 이동시키는 즉각적인 인수가있을 수 있음) 포인터가 터진 후 n 바이트 씩 올라간다).프로세서는 어떻게 가까운 수익에서 먼 수익을 식별 할 수 있습니까?

이것은 올바르게 해석하면 하드웨어가 세그먼트 선택기와 올바른 레지스터에 오프셋을 적용하기에 충분합니다.

그러나 시스템에서 반환 값이 멀리 있어야하며 오프셋과 선택기가 모두 팝되어야한다고 시스템에서 어떻게 알 수 있습니까?

하드웨어가 오프셋 된 포인터를 표시하고 선택기가 나타나지 않으면 올바른 오프셋이지만 잘못된 세그먼트를 가리키게됩니다.

가까운 반환 버전과 비교하여 먼 반환 명령에 특별한 것은 없습니다.

그들은 둘 다 똑같이 보입니다.

아마도 마이크로 아키텍처 수준의 프로세서가 어떤 호출이 멀리 있고 어느 쪽이 가까이 있는지 추적하여 그 시스템이 반환 될 때 시스템에서 얼마나 많은 바이트를 나타낼 것인지, 어디에서 가져올 것인지를 알고 있다고 가정합니다. 그들 (포인터 레지스터와 세그먼트 선택기 레지스터)을 팝하십시오.

내 가정이 맞습니까?

당신은이 메커니즘에 대해 무엇을 알고 있습니까?

답변

0

프로세서는 호출이 멀리 또는 가까이 있어야하는지 여부를 추적하지 않습니다. 컴파일러은 far 또는 near opcode를 사용하여 함수 호출을 인코딩하고 반환하는 방법을 결정합니다.

그렇듯이 FAR과 NEAR는 최신 프로세서에서는 아무런 의미가 없습니다. 모든 함수 호출과 리턴은 효과적으로 FAR입니다.

FAR 및 NEAR는 세그먼트 화 된 메모리 모델을 사용하는 이전 86 개의 프로세서에서 사용되었습니다. 당시 프로그램은 "소형"에서 "대형"에 이르기까지 지원하고자하는 아키텍처 유형을 선택해야했습니다. 프로그램이 단일 세그먼트에 들어가기에 충분히 작 으면 NEAR 호출을 사용하여 컴파일되어 독점적으로 리턴 될 수 있습니다. 그것이 "크다"면 그 반대가 사실입니다. 그 사이의 모든 것에 대해, 당신은 지역 함수가 다른 세그먼트의 코드에서 호출 가능/반환 가능해야하는지 여부를 선택하는 권한을 가졌습니다.

대부분의 최신 프로그램 (부트 로더 외에도)은 다른 구조로 실행됩니다. 플랫 메모리 모델을 기대합니다. 뒤에서 OS는 필요에 따라 메모리를 교체하지만, 프로그램에 관한 한 메모리에서 작동하는 유일한 것입니다. (이것은 단순화입니다.)

그러나 질문에 대답하기 위해 호출/반환의 차이는 사용 된 opcode입니다. 프로세서는 주어진 명령을 따른다. 평면 모드 일 때 NEAR 반환 op 코드를 잘못 입력하면 오류가 발생합니다.

+0

확인. 어쨌든 돌아가는 지시의 다른 형태가 있다고 해봅시다. 알았다. 감사. – tensor