Kısa cevap : Derlenmiş, bağlantılı bir çalıştırılabilir dosyayı çeviremezsiniz. Teknik olarak mümkün olmakla birlikte, başarılması son derece imkansızdır (aşağıya bakınız). Ancak , derleme kaynak dosyanız varsa (yönergeleri ve etiketleri içerir), (program kaynağında bir şekilde elde ederseniz, program derlemede yazılmadığı sürece, orijinal program kaynak koduna sahip olmanız gerekir) yani, farklı mimarinin başlaması için onu derlemeniz daha iyi olur).
Uzun cevap :
QEMU ve diğer emülatörler, talimatları anında çevirebilir ve bu nedenle derlenmediği bir bilgisayarda yürütülebilir bir dosya çalıştırabilir. Süreci hızlandırmak için neden bu çeviriyi anında yapmak yerine yapmıyorsunuz?
Prensip olarak kolay göründüğünü biliyorum, ama pratikte, birkaç ana nedenden dolayı neredeyse imkansız. Başlamak için, farklı komut setleri büyük ölçüde farklı adresleme modları, farklı opcode yapıları, farklı kelime boyutları kullanır ve bazılarında ihtiyacınız olan talimatlar bile yoktur.
Diyelim ki talimatı XYZ
iki talimatla değiştirmeniz gerekiyor ABC
ve DEF
. Şimdi, tüm programdaki tüm göreli / ofset adreslerini bu noktadan itibaren etkili bir şekilde kaydırdınız, bu nedenle tüm programı analiz etmeniz ve geçmeniz ve ofsetleri (değişiklikten önce ve sonra) güncellemeniz gerekir. Şimdi, ofsetlerden birinin önemli ölçüde değiştiğini varsayalım - şimdi adresin boyutunu değiştirebilecek adresleme modlarını değiştirmeniz gerekiyor. Bu, sizi tüm dosyayı yeniden taramaya ve tüm adresleri yeniden hesaplamaya vb. Zorlar.
Montaj programları yazdığınızda etiketleri kullanabilirsiniz, ancak CPU kullanmaz - dosya birleştirildiğinde, tüm etiketler göreli, mutlak veya ofset konumları olarak hesaplanır. Bunun neden hızla önemsiz bir görev haline geldiğini ve imkansızın yanında görebilirsiniz. Tek bir talimatın değiştirilmesi, devam etmeden önce tüm programdan yüzlerce kez geçmenizi gerektirebilir.
Biraz sınırlı montaj bilgimden, MOV, ADD ve diğerleri gibi talimatların çoğu mimariler arasında taşınabilir olmalıdır.
Evet, ancak yukarıda özetlediğim konulara bakın. Makinenin kelime boyutu ne olacak? Adres uzunluğu? Aynı adresleme modlarına bile sahip mi? Yine, sadece talimatları "bulamaz ve değiştiremezsiniz". Bir programın her bölümünün özel olarak tanımlanmış bir adresi vardır. Bir program kurulduğunda diğer etiketlere atlamalar gerçek veya ofset bellek adresleriyle değiştirilir.
Doğrudan bir eşlemesi olmayan herhangi bir şey, tüm makineler Turing Complete olduğundan diğer bazı talimatlarla eşlenebilir. Bunu yapmak çok karmaşık olur mu? Bilmiyorum nedense hiç işe yaramaz mı? Çalışır, ancak bir emülatör kullanmaktan daha iyi sonuç vermez mi?
Her ikisinin de mümkün olduğu ve çok daha hızlı olacağı için % 100 haklısınız . Ancak, bunu gerçekleştirmek için bir program yazmak, yukarıda özetlediğim konular dışında bir şey olmasa bile, inanılmaz derecede zor ve son derece imkansızdır.
Gerçek montaj kaynak koduna sahip olsaydınız, makine kodunu başka bir talimat kümesi mimarisine çevirmek önemsiz olurdu. Bununla birlikte, makine kodunun kendisi monte edilir , bu nedenle montaj kaynağı (bellek adreslerini hesaplamak için kullanılan çeşitli etiketler içerir) olmadan, inanılmaz derecede zorlaşır. Yine, tek bir komutun değiştirilmesi tüm programdaki bellek ofsetlerini değiştirebilir ve adresleri yeniden hesaplamak için yüzlerce geçiş gerektirebilir.
Bunu birkaç bin talimatı olan bir program için yapmak, yüz binlerce geçiş olmasa bile onlarca gerektirir. Nispeten küçük programlar için bu mümkün olabilir, ancak geçiş sayısının programdaki makine talimatlarının sayısı ile katlanarak artacağını unutmayın. Yeterince iyi bir boyutta herhangi bir program için, neredeyse imkansızdır.