간단한 해결책 :
일반적인 접근법 중 하나는 인라인 어셈블리를 추가하고 명령어 바이트를 직접 인코딩하는 것입니다.
예를 들어:
int main()
{
asm __volatile__ (".byte 0x90\n");
return 0;
}
컴파일 (gcc -o3)에 :
00000000004005a0 <main>:
4005a0: 90 nop
4005a1: 31 c0 xor %eax,%eax
4005a3: c3 retq
따라서 0x90을 Inst 바이트로 교체하십시오. 물론 일반 objdump에서 실제 명령을 보지 못하고 프로그램이 시스템에서 실행되지 않을 수 있지만 (NOP 조합 중 하나를 사용하지 않는 한) 시뮬레이터는 올바르게 구현 된 경우이를 인식해야합니다.
이 명령어를 알지 못할 때 컴파일러가 자신에게 잘 최적화 될 것으로 기대할 수 없으며, 상태 (레지스터, 메모리)가 변경되면 인라인 어셈블리 클로버/입력/출력 옵션을 관리하고 작업해야합니다. 정확성을 확인하십시오. 필요한 경우에만 최적화를 사용하십시오.
복잡한 솔루션
대안적인 접근 방식은 컴파일러에서이를 구현하는 것입니다. GCC에서 수행 할 수 있지만 의견에 언급 된대로 LLVM은 아마도 컴파일러 개발 플랫폼으로 설계되었으므로 여전히 플레이하기에 가장 좋은 것 중 하나 일 것입니다. 그러나 여전히 매우 복잡합니다. LLVM은 IR 최적화 단계에 가장 적합하며 대상 별 백엔드를 수정하려고 할 때 다소 친숙하지 않습니다.
그럼에도 불구하고, 그것은 가능하며, 컴파일러 가이 명령을 발행 할시기를 결정하도록 계획한다면 그렇게해야합니다. 그러나 첫 번째 옵션에서 시작하여 시뮬레이터 가이 추가로 작동하는지 확인하고 컴파일러 측에서 시간을 보내는 것이 좋습니다.
LLVM에서 이것을 구현하기로 결정한 경우, 가장 좋은 방법은 본질적인 기능으로 정의하는 것입니다. 여기에는 이에 대한 문서가 비교적 더 있습니다. http://llvm.org/docs/extendingllvm.html