문제

어셈블리에 무엇이든 쓰거나 모든 프로그램에 어셈블리를 추가하면 이식성에 해를 끼칩니다. 그러나 얼마나 나쁘습니까? 내 말은, 기본적으로 모든 PC는 요즘 x86 또는 x64입니다. 따라서 어셈블리가 C 프로그램에 포함된다면 왜 어디로 갔는지에 관계없이 여전히 여전히 컴파일하지 않습니까?

이 포트 가능성이라는이 개념은 진짜 특정 프로세서의 특정 단점을 파고 코드에서 모든 성능 낙하를 짜내십니까?

PC 게임 "Roller Coaster Tycoon"은 내가 정확하게 기억한다면 거의 전적으로 어셈블리 언어로 작성되었습니다. 그래서 ... 실제로 얼마나 지적 할 수 없는가?

도움이 되었습니까?

해결책

프로세서 자체 외에도 항상 다른 고려 사항이 있습니다. 대상 플랫폼의 호출 규칙은 무엇입니까? 어떻게 struct 다른 (예 : API) 함수로 전달 된 값은? Callee에 의해 어떤 레지스터가 뭉개질 수 있습니까? 발신자에게 보존 될 보장되는 것은 무엇입니까? 시스템 호출 방법은 무엇입니까? 프로세스 시작시 OS에서 준비한 메모리 레이아웃은 무엇입니까?

다른 팁

포팅 어셈블리에는 ABI의 문제도 OS마다 다릅니다. UNIX에서 Windows로 (또는 Linux에서 OpenBSD까지) C 프로그램을 포팅하는 것은 간단한 재 컴파일 일 수 있지만 어셈블리 프로그램의 경우 일부 Callee-SAVE 레지스터가 발신자 사무실이되거나 부동 소수점 매개 변수가 있음을 알 수 있습니다. 다르게 통과했습니다.

그리고 이것은 이론적 일뿐 만 아니라 즉. PowerPC 버전의 Linux 및 Mac OS X의 R2 등록. 실제로 AMD는 64 비트 명령 세트와 동시에 "권장"ABI를 게시했습니다.

"PC == Windows"라고 생각되면 C 프로그램에 어셈블러를 추가하면 크게 아프지 않습니다. UNIX 세계로 들어 오면 PS3 또는 Xbox, Old Mac 및 강력한 서버에 PPC가 많이 있습니다. 많은 작은 장치의 경우 팔이 있습니다. 임베디드 장치 (오늘날 설치된 CPU의 대다수를 설명하는)는 일반적으로 특별 명령 세트와 함께 자신의 사용자 정의 CPU를 사용합니다.

따라서 오늘날 많은 PC는 인텔 코드를 실행할 수 있지만 모든 CPU의 작은 부분에 대해서만 설명합니다.

즉, x86 코드도 항상 동일하지는 않습니다. 어셈블리 코드에는 두 가지 주된 이유가 있습니다. 인터럽트 레지스터와 같은 특수 기능에 액세스해야하거나 코드를 최적화해야합니다. 첫 번째 경우 코드는 매우 휴대가 가능합니다. 후자의 경우, 각 CPU는 약간 다릅니다. 그들 중 일부는 가지고 있습니다 SSE. 그러나 SSE는 곧 SSE3 및 SSE4로 대체 된 SSE2로 대체되었습니다. AMD에는 자체 브랜드가 있습니다. 곧 AVX가있을 것입니다. Opcode 레벨에서 각각은 다양한 버전의 CPU에 대해 약간 다른 타이밍을 가지고 있습니다.

상황을 악화시키기 위해 일부 opcode에는 CPU의 특정 스피킹에 고정 된 버그가 있습니다. 또한 일부 OPCode는 다른 버전의 CPU에서 다른 버전보다 훨씬 빠릅니다.

다음 으로이 어셈블리 코드를 C 부분과 인터페이스해야합니다. 그것은 일반적으로 당신이 다루어야한다는 것을 의미합니다 아비 문제.

따라서 이것이 임의로 복잡해질 수 있음을 알 수 있습니다.

어셈블리는 특정 프로세서에 대한 지침을 직접 작성하고 있습니다. 즉, X86이 영원히 살면 코드가 휴대 할 수있는 경우 Yeaah를 의미합니다.

그러나 지금도 ARM 프로세서가 돌아오고 있습니다 (예 : 차세대 순 책). 내년에 프로세서가 변경되지 않을지 확신합니다.

어셈블리 언어는 디자인으로 휴대 할 수 없다고 말합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top