"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, 귀하의 프로그램이 다른 프로세스와 상호 작용하지 않는 한 컨벤션 및 데이터 구조 호출은 중요하지 않겠지 만. 메모리 레이아웃에 관해서는, 프로그램을 타겟 플랫폼의 표준 C 라이브러리에 링크하고'malloc()'등을 사용한다면 어떻게 될까? –
@Carson : mixed-in 어셈블리에서 C로 작성된 함수를 호출 할 수 있기를 원하기 때문에 함수 호출 규칙도 중요합니다. 반대의 경우도 마찬가지입니다. – unwind
예, 좋은 지적입니다. –