คำตอบสั้น ๆ : คุณไม่สามารถแปลไฟล์ประมวลผลที่คอมไพล์และเชื่อมโยงได้ ในขณะที่เป็นไปได้ทางเทคนิคมันเป็นไปไม่ได้สูงที่จะบรรลุ (ดูด้านล่าง) อย่างไรก็ตามถ้าคุณมีไฟล์ต้นฉบับแอสเซมบลี (มีคำแนะนำและป้ายกำกับ) มันเป็นไปได้ที่จะทำ (แม้ว่าคุณจะได้รับแอสเซมบลีอย่างใดเว้นแต่ว่าโปรแกรมจะเขียนในแอสเซมบลีคุณควรมีซอร์สโค้ดโปรแกรมต้นฉบับ ดีดังนั้นคุณควรรวบรวมมันให้ดีขึ้นเพื่อให้สถาปัตยกรรมที่แตกต่างเริ่มต้นด้วย)
คำตอบที่ยาว :
QEMU และอีมูเลเตอร์อื่น ๆ สามารถแปลคำแนะนำได้ทันทีดังนั้นจึงเรียกใช้ไฟล์ปฏิบัติการได้บนคอมพิวเตอร์ที่ไม่ได้รวบรวมไว้ ทำไมไม่แปลเร็ว ๆ นี้แทนที่จะทำทันทีเพื่อเร่งกระบวนการ?
ฉันรู้ว่ามันอาจดูง่ายในหลักการ แต่ในทางปฏิบัติมันเป็นไปไม่ได้เกือบด้วยเหตุผลหลักสองสามข้อ ในการเริ่มต้นชุดคำสั่งต่าง ๆ จะใช้โหมดการกำหนดแอดเดรสที่แตกต่างกันส่วนใหญ่โครงสร้าง opcode ที่แตกต่างกันขนาดคำที่ต่างกันและบางคำอาจไม่มีคำแนะนำที่คุณต้องการ
สมมติว่าคุณจำเป็นต้องเปลี่ยนการเรียนการสอนXYZ
ที่มีสองคำแนะนำเพิ่มเติมและABC
DEF
ตอนนี้คุณได้เลื่อนที่อยู่สัมพัทธ์ / ออฟเซ็ตทั้งหมดในโปรแกรมทั้งหมดจากจุดนั้นอย่างมีประสิทธิภาพดังนั้นคุณจะต้องวิเคราะห์และผ่านโปรแกรมทั้งหมดและอัปเดตออฟเซ็ต (ทั้งก่อนและหลังการเปลี่ยนแปลง) ทีนี้สมมติว่าหนึ่งในออฟเซ็ตมีการเปลี่ยนแปลงอย่างมากตอนนี้คุณต้องเปลี่ยนโหมดการกำหนดแอดเดรสซึ่งอาจเปลี่ยนขนาดของที่อยู่ การดำเนินการนี้จะบังคับให้คุณสแกนไฟล์ทั้งหมดอีกครั้งและคำนวณที่อยู่ทั้งหมดอีกครั้งและอื่น ๆ และลำดับที่สี่
เมื่อคุณเขียนโปรแกรมแอสเซมบลีคุณอาจใช้เลเบล แต่ CPU ไม่ได้ - เมื่อประกอบไฟล์แล้วเลเบลทั้งหมดจะถูกคำนวณว่าเป็นตำแหน่งสัมพัทธ์สัมบูรณ์หรือออฟเซ็ต คุณสามารถดูว่าทำไมสิ่งนี้จึงกลายเป็นเรื่องไม่สำคัญอย่างรวดเร็วและเป็นไปไม่ได้ การเปลี่ยนคำสั่งเดียวอาจทำให้คุณต้องผ่านโปรแกรมทั้งหมดหลายร้อยครั้งก่อนที่จะดำเนินการต่อ
จากความรู้เกี่ยวกับการประกอบที่ จำกัด ของฉันคำแนะนำส่วนใหญ่เช่น MOV, ADD และอื่น ๆ ควรพกพาข้ามสถาปัตยกรรม
ใช่ แต่ดูที่ปัญหาที่ฉันระบุไว้ด้านบน ขนาดของคำศัพท์ของเครื่องเป็นอย่างไร? ที่อยู่ยาวหรือไม่ มันมีโหมดการกำหนดแอดเดรสเหมือนกันหรือไม่? อีกครั้งคุณไม่เพียงแค่ "ค้นหาและแทนที่" คำแนะนำ ทุกส่วนของโปรแกรมมีที่อยู่ที่กำหนดไว้โดยเฉพาะ การข้ามไปยังป้ายกำกับอื่นจะถูกแทนที่ด้วยที่อยู่หน่วยความจำที่แท้จริงหรือออฟเซ็ตเมื่อมีการประกอบโปรแกรม
สิ่งที่ไม่ได้มีการแมปโดยตรงสามารถแมปกับชุดคำสั่งอื่น ๆ ได้เนื่องจากเครื่องทั้งหมดนั้นกำลังทำทัวริงเสร็จสมบูรณ์ การทำเช่นนี้จะซับซ้อนเกินไปหรือไม่ มันจะไม่ทำงานด้วยเหตุผลบางอย่างที่ฉันไม่คุ้นเคยหรือไม่ มันจะใช้งานได้ แต่ให้ผลลัพธ์ไม่ดีไปกว่าการใช้อีมูเลเตอร์?
คุณถูกต้อง 100% ว่ามันมีทั้งที่เป็นไปได้และจะมากได้เร็วขึ้น อย่างไรก็ตามการเขียนโปรแกรมเพื่อให้บรรลุนี้เป็นเรื่องยากอย่างเหลือเชื่อและไม่น่าเป็นไปได้สูงหากไม่ใช่เพื่อสิ่งใดนอกจากปัญหาที่ฉันระบุไว้ข้างต้น
หากคุณมีซอร์สโค้ดแอสเซมบลีที่เกิดขึ้นจริงมันจะไม่สำคัญที่จะแปลรหัสเครื่องเป็นสถาปัตยกรรมชุดคำสั่งอื่น อย่างไรก็ตามรหัสเครื่องนั้นถูกประกอบเข้าด้วยกันดังนั้นหากไม่มีแหล่งประกอบ (ซึ่งมีป้ายกำกับต่าง ๆ ที่ใช้ในการคำนวณที่อยู่หน่วยความจำ) ก็จะกลายเป็นเรื่องยากอย่างไม่น่าเชื่อ อีกครั้งการเปลี่ยนคำสั่งเดียวอาจเปลี่ยนหน่วยความจำ offsets ในโปรแกรมทั้งหมดและต้องผ่านหลายร้อยเพื่อคำนวณที่อยู่อีกครั้ง
การทำเช่นนี้สำหรับโปรแกรมที่มีคำสั่งไม่กี่พันคำสั่งจะต้องมีการนับหมื่นหากไม่ผ่านไปหลายแสนครั้ง สำหรับโปรแกรมที่มีขนาดค่อนข้างเล็กอาจเป็นไปได้ แต่โปรดจำไว้ว่าจำนวนการส่งผ่านจะเพิ่มขึ้นตามจำนวนคำสั่งเครื่องในโปรแกรม สำหรับโปรแกรมที่มีขนาดพอเหมาะมันใกล้จะเป็นไปไม่ได้