2010-05-05 3 views
20

일부 소스 코드에는 FAR과 PASCAL과 같은 매크로가 왜 있는지 궁금합니다. 그들은 무엇을 의미합니까? 감사합니다.파 파스칼 (FAR PASCAL)이란 무엇입니까?

+10

그들은 타임 머신을 호출하고 30 세의 빌 게이츠가 튀어 나와 그의 640k를 요구합니다. –

답변

19
  • 파스칼 : 이것은 calling convention과 관련됩니다. 매개 변수는 왼쪽에서 오른쪽 순서 (cdecl과 반대)로 스택에 푸시되고 호출 수신자는 반환 전에 스택 균형 조정을 담당합니다.

    이 호출 규칙은 OS/2 1.x 및 Microsoft Windows 3.x와 같은 16 비트 API에서 일반적으로 사용되었습니다. Borland Delphi 1.x가 사용되었는지에 대한 분쟁이 있습니다. 은 세그먼트 선택기가 포함 된 포인터로, 현재 세그먼트 외부의 주소를 가리킬 수있게합니다. .

완성도를 들어, FAR 및 PASCAL 16 비트 시스템 용으로 컴파일 할 때, 호출 규칙 및 포인터의 크기를 선언 할 필요가 있었다 키워드 확장 prepreocessor 매크로입니다. 32 비트 시스템에서는 일반적으로 이상한 기본 호출 규칙이 없으면 아무 것도 확장하지 않습니다. 매크로는 이전 버전과의 호환성을 위해 유지된다 {모자/팁 : 코멘트를 Adrian McCarthy에서}

+0

저는 델파이 호출 규칙이 언제나 * register * 였다고 확신합니다. Windows API 및 다른 DLL의 함수에는 * pascal * 만 사용되었습니다. –

+3

완벽을 기하기 위해'FAR'과'PASCAL'은 16 비트 시스템 용으로 컴파일 할 때 호출 규칙과 포인터 크기를 선언하는 데 필요한 키워드로 확장하는 선행 분석기 매크로입니다. 32 비트 시스템에서는 일반적으로 이상한 기본 호출 규칙이 없으면 아무 것도 확장하지 않습니다. 매크로는 이전 버전과의 호환성을 위해 유지됩니다. –

3

FAR은 (16 비트) 및 원거리 (32 비트) 포인터가있을 때 16 비트 홀드 오버입니다.

PASCAL은 호출 규칙입니다. 요즘은 stdcall과 같습니다.

9

, 여기에 메모리로가는 힙 메모리가 분할 된 때

는 FAR 다시 16 비트 일 가을입니다. NEAR 데이터의 크기와 크기는 제한적 이었지만 FAR은 더 크지 만 더 비쌌습니다.

내가 아는 한 32 비트 토지에서는 아무 것도 접을 수없는 매크로입니다.

파스칼은 16 비트 일에도 많이 사용되는 호출 규칙입니다. 이후 stdcall로 대체되었습니다.

둘 모두 이전 버전과의 호환성을 위해 남아 있습니다.

1

그것은 아마/중복되지 않는이 16 비트 시대에서 남은 코딩 일부.

16 비트 응용 프로그램에서 FAR을 사용하여 주소가 16 비트 이상 필요하다는 것을 나타 냈습니다.

파스칼 (altion)은 변환 유형이므로 컴파일러에서 함수와 적절한 매개 변수를 전달할 수 있도록 PASCAL 호출 규칙을 사용하여 스택을 정렬하는 방법을 컴파일러에서 알 수 있습니다.

HTH

2

이 오래된 호출 규칙입니다 ...

는 FAR 시간에서 상속 할 때 너무 작은 점프 대상의 전체 주소를 보유하는 프로세서 레지스터. 그래서, 프로세서는 목적지가 현재 프로그램 카운터에서 "멀리"있는 방식에 따라 2 가지 유형의 점프를가집니다.

PASCAL은 스택에서의 인수 순서를 설명합니다.이 함수는 C와는 다른 Pascal 프로그래밍 언어에 의해 설명 된 순서를 사용함을 나타냅니다 (Pascal을 사용하여 개발 한 MacOS 및 Windows와 같은 아주 오래된 운영 체제) .

6

FAR은 더 이상 사용되지 않습니다. 16 비트 코드에서 현재 세그먼트에 대한 16 비트 오프셋이 아닌 전체 주소 공간을 주소 지정할 수있는 포인터를 나타 내기 위해 사용되었습니다.

파스칼은 호출 규칙입니다. Wikipedia 그것을 설명 같이

파라미터는 왼쪽에서 오른쪽으로 (cdecl을 반대)의 스택에 푸시하고, 상기 수신자는 반환 전에 스택 분산 할 책임이있다.

이 호출 규칙은 OS/2 1.x, Microsoft Windows 3.x 및 Borland Delphi 버전 1.x에서 일반적으로 사용되는 16 비트 API입니다.

+0

Mark, C++을 처음 사용하고 일부 오래된 C/C++ 코드를 C++ 11로 변환하라는 요청을 받았습니다. 'short FAR *'데이터 형식이 많이 채택되어 VS2013에서 해결되지 않습니다. 대체해야합니까? – MoonKnight

+0

@Killercam 당신은 그들을 찾을 때마다'FAR'과'NEAR'를 그냥 떨어 뜨릴 수 있어야합니다. 마이크로 소프트 헤더에 의해 빈 매크로가'#define '되어 있지 않다는 사실에 놀랐지 만 그들은 역 호환성의 왕입니다. –

1

는 특히 파스칼은 올바른 순서로 왼쪽에 전달되는 함수의 인수는,이 (발신자 그래서 스택이 얼마나 큰지 알고 있기 때문에 그것을 청소 수)

코드의 크기를 줄일 말한다 C stdcall은 오른쪽에서 왼쪽으로 인수를 전달합니다. 즉, 가변 개수의 인수를 가질 수 있지만 더 많은 코드가 필요합니다.

관련 문제