짧은 대답 : 컴파일 된 링크 된 실행 파일을 번역 할 수 없습니다. 기술적으로는 가능하지만 달성하기는 매우 어렵습니다 (아래 참조). 그러나 어셈블리 소스 파일 이있는 경우 (명령 및 레이블 포함) 수행 할 수 있습니다 (어떻게 어셈블리 소스를 얻더라도 프로그램을 어셈블리로 작성하지 않는 한 원래 프로그램 소스 코드는 다음과 같습니다). 글쎄, 그래서 당신은 다른 아키텍처가 시작되도록 컴파일하는 것이 좋습니다.)
긴 대답 :
QEMU 및 기타 에뮬레이터는 명령을 즉석에서 번역 할 수 있으므로 컴파일되지 않은 컴퓨터에서 실행 파일을 실행할 수 있습니다. 프로세스 속도를 높이기 위해이 번역을 즉석 대신 미리 수행하지 않겠습니까?
원칙적으로 쉽지만 실제로는 몇 가지 주요 이유로 거의 불가능합니다. 시작하기 위해 다른 명령어 세트는 크게 다른 주소 지정 모드, 다른 opcode 구조, 다른 단어 크기를 사용하며 일부 명령어에는 필요한 명령어가 없습니다.
하자 당신이 명령을 대체하는 데 필요한 말을 XYZ
두 개 더 지침, ABC
그리고 DEF
. 이제 전체 프로그램의 모든 상대 / 오프셋 주소를 그 시점부터 효과적으로 이동 했으므로 전체 프로그램을 분석하고 전체 프로그램을 살펴보고 오프셋 (변경 전후)을 업데이트해야합니다. 이제 오프셋 중 하나가 크게 변경되었다고 가정하겠습니다. 이제 주소 지정 모드를 변경해야하므로 주소 크기가 변경 될 수 있습니다. 이렇게하면 전체 파일을 다시 스캔하고 모든 주소 등을 다시 계산해야합니다.
어셈블리 프로그램을 작성할 때 레이블을 사용할 수 있지만 CPU는 그렇지 않습니다. 파일이 어셈블 될 때 모든 레이블은 상대, 절대 또는 오프셋 위치로 계산됩니다. 이것이 왜 사소한 일이 아닌 불가능한 일이되는 이유를 알 수 있습니다. 교체 단일 명령은에 이동하기 전에 전체 프로그램의 수백 시간을 통과하도록 요구할 수 있습니다.
조립에 대한 다소 제한된 지식으로 인해 MOV, ADD 및 기타 명령과 같은 대부분의 명령은 아키텍처에서 이식 가능해야합니다.
예, 그러나 위에서 설명한 문제를 살펴보십시오. 기계의 단어 크기는 어떻습니까? 주소 길이? 동일한 주소 지정 모드가 있습니까? 다시 한 번, "찾기 및 바꾸기"지침 만 수행 할 수 없습니다. 프로그램의 모든 세그먼트에는 구체적으로 정의 된 주소가 있습니다. 프로그램이 조립 될 때 다른 레이블로의 점프는 리터럴 또는 오프셋 메모리 주소로 대체됩니다.
모든 기계가 Turing Complete이므로 직접 매핑이없는 것은 다른 명령어 세트에 매핑 될 수 있습니다. 이 작업이 너무 복잡합니까? 내가 익숙하지 않은 이유로 전혀 작동하지 않습니까? 작동하지만 에뮬레이터를 사용하는 것보다 더 나은 결과를 얻지 못합니까?
둘 다 가능 하고 훨씬 빠르다 는 것을 100 % 정확합니다 . 그러나 위에서 설명한 문제를 제외하고는 그렇지 않은 경우이 작업을 수행하기 위해 프로그램을 작성하는 것은 매우 어렵고 불가능합니다.
실제 어셈블리 소스 코드를 가지고 있다면 머신 코드를 다른 명령어 세트 아키텍처로 변환하는 것이 쉽지 않습니다. 그러나 머신 코드 자체는 어셈블 되므로 메모리 소스를 계산하는 데 사용되는 다양한 레이블이 포함 된 어셈블리 소스가 없으면 매우 어려워집니다. 다시 한 번, 단일 명령을 변경하면 전체 프로그램의 메모리 오프셋이 변경 될 수 있으며 주소를 다시 계산하려면 수백 번의 패스가 필요합니다.
몇 천 개의 명령어가있는 프로그램에 이것을 수행하려면 수십만 패스가 아니라면 수십 개가 필요합니다. 비교적 작은 프로그램의 경우 이것이 가능할 수 있지만 프로그램의 기계 명령 수에 따라 패스 수가 기하 급수적으로 증가한다는 점을 기억하십시오. 충분한 크기의 프로그램은 거의 불가능합니다.