2009-09-18 2 views
6

어셈블리에서 아무것도 쓰지 않거나 어셈블리를 모든 프로그램에 추가하면 이식성이 손상된다는 것을 알고 있습니다. 하지만, 얼마나 나빠요? 기본적으로 모든 PC는 요즘 x86이나 x64입니다. 맞습니까? 그래서 C 프로그램에 어셈블리를 임베드한다면 왜 그것이 어디서 컴파일 되더라도 컴파일되지 않을까요?어셈블리 언어는/portable /?입니다.

실제로 특정 프로세서의 특정 단점을 파헤 치면 코드 조각에서 성능 저하를 모두 막을 수 있습니다.

정확하게 기억하면 PC 게임 "롤러 코스터 타이쿤"이 거의 어셈블리 언어로 작성되었습니다. 그럼 ... 어떻게 이식 할 수 없게 될 수 있겠습니까?

답변

16

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

+1

+1, 귀하의 프로그램이 다른 프로세스와 상호 작용하지 않는 한 컨벤션 및 데이터 구조 호출은 중요하지 않겠지 만. 메모리 레이아웃에 관해서는, 프로그램을 타겟 플랫폼의 표준 C 라이브러리에 링크하고'malloc()'등을 사용한다면 어떻게 될까? –

+0

@Carson : mixed-in 어셈블리에서 C로 작성된 함수를 호출 할 수 있기를 원하기 때문에 함수 호출 규칙도 중요합니다. 반대의 경우도 마찬가지입니다. – unwind

+0

예, 좋은 지적입니다. –

3

어셈블리는 특정 프로세서에 대한 직접적인 명령을 작성합니다. 이는 x86이 영원히 살면 코드가 어떻게 든 옮겨 질 수 있다는 것을 의미합니다.

하지만 이제는 팔 프로세서가 다시 돌아오고 있습니다 (차세대 인터넷 서적). 내년에 프로세서가 변경되지 않는다고 확신합니다.

어셈블리 언어는 휴대용이 아닙니다.

11

포팅 어셈블리에는 OS에 따라 ABI의 문제가 있습니다. C 프로그램을 유닉스에서 윈도우로 (또는 리눅스에서 OpenBSD로) 포팅하는 것은 간단한 재 컴파일 일지 모르지만, 어셈블리 프로그램의 경우, 일부 피 호출자 저장 레지스터가 호출자 저장이되거나 부동 소수점 매개 변수가 다르게 전달되었습니다.

그리고 이것은 이론적 인 것이 아닙니다. Linux 및 Mac OS X의 PowerPC 버전 r2를 등록하십시오. 실제로 문제는 그리 좋지 않을 수 있습니다. 예를 들어 AMD는 64 비트 명령어 세트와 동시에 "권장"ABI를 게시했습니다.

9

"PC == Windows"라고 생각하면 C 프로그램에 어셈블러를 추가해도 큰 상처는 없습니다. 유닉스 세계로 들어서려면 PS3 나 XBox의 PPC, 구형 맥 및 많은 강력한 서버와 같은 많은 CPU가 있어야합니다. 많은 소형 장치에는 ARM이 필요합니다. 현재 설치된 대다수의 CPU를 차지하는 임베디드 장치는 일반적으로 특수 명령어 세트가있는 자체 맞춤 CPU를 사용합니다.

오늘날 많은 PC가 인텔 코드를 실행할 수 있지만, 이는 소수의 CPU 만 차지합니다.

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

일부 opcode에는 특정 CPU 스테핑에서 수정 된 버그가 있습니다. 그 중 일부 opcode는 특정 버전의 CPU에서 다른 것보다 훨씬 빠릅니다.

다음으로이 어셈블리 코드를 C 부분과 인터페이스해야합니다. 보통은 ABI 호 문제를 처리해야합니다.

이렇게하면 임의로 복잡해질 수 있습니다.

+1

+1 : 예 : Linux는 십여 개 이상의 CPU 아키텍처에서 지원됩니다. 또 다른 예로 Apple Unix 생태계가 있습니다. Cocoa 코드는 최근 Mac에서는 x86을, 구형 Mac에서는 PPC를, iPhone에서는 ARM을 지원할 수 있습니다. – mouviciel

+1

잘 말했다. "PC"는 윈도우가 아니라 평범한 개인용 컴퓨터 (X 박스와 임베디드 시스템을 제외한 서버가 아닌 다른 사람의 집에서 찾을 수있는 것)를 말합니다. –

+0

나는 당신이 "PC = windows"를 의미했다고 생각합니다. 그렇지 않으면 "모든 것이 x86 또는 x64"라고 가정하지 않을 것입니다 :-) – hirschhornsalz

관련 문제