รหัสวัตถุรหัสเครื่องจักรและรหัสการประกอบต่างกันอย่างไร
คุณสามารถยกตัวอย่างที่เป็นภาพเกี่ยวกับความแตกต่างได้หรือไม่?
รหัสวัตถุรหัสเครื่องจักรและรหัสการประกอบต่างกันอย่างไร
คุณสามารถยกตัวอย่างที่เป็นภาพเกี่ยวกับความแตกต่างได้หรือไม่?
คำตอบ:
รหัสเครื่องเป็นรหัสไบนารี่ (1 และ 0) ที่สามารถเรียกใช้งานได้โดยตรงจาก CPU หากคุณกำลังจะเปิดแฟ้มรหัสเครื่องในโปรแกรมแก้ไขข้อความที่คุณจะเห็นขยะรวมทั้งตัวละคร unprintable (ไม่มีไม่ผู้อักขระ unprintable;))
รหัสวัตถุเป็นส่วนหนึ่งของรหัสเครื่องที่ยังไม่ได้เชื่อมโยงกับโปรแกรมที่สมบูรณ์ เป็นรหัสเครื่องสำหรับห้องสมุดหรือโมดูลหนึ่งที่จะสร้างผลิตภัณฑ์ที่สมบูรณ์ นอกจากนี้ยังอาจมีตัวยึดตำแหน่งหรือออฟเซ็ตที่ไม่พบในรหัสเครื่องของโปรแกรมที่เสร็จสมบูรณ์ ลิงเกอร์จะใช้ตัวยึดตำแหน่งเหล่านี้และชดเชยการร่วมกันทุกอย่างเชื่อมต่อ
รหัสแอสเซมบลีเป็นข้อความธรรมดาและ (ค่อนข้าง) ซอร์สโค้ดที่มนุษย์สามารถอ่านได้ซึ่งส่วนใหญ่มีแอนะล็อกโดยตรง 1: 1 พร้อมคำแนะนำเครื่อง สิ่งนี้สามารถทำได้โดยใช้ตัวช่วยจำสำหรับคำแนะนำจริงการลงทะเบียนหรือทรัพยากรอื่น ๆ ตัวอย่างรวมถึงJMP
และMULT
สำหรับคำแนะนำการกระโดดและการคูณของ CPU ซีพียูไม่เข้าใจรหัสการประกอบต่างจากรหัสเครื่อง คุณแปลงแอสเซมบลีโค้ดเป็นเครื่องด้วยการใช้แอสเซมเบลอร์หรือคอมไพเลอร์แม้ว่าเรามักจะคิดถึงคอมไพเลอร์ร่วมกับภาษาการเขียนโปรแกรมระดับสูงที่แยกออกจากคำสั่ง CPU
การสร้างโปรแกรมที่สมบูรณ์เกี่ยวข้องกับการเขียนซอร์สโค้ดของโปรแกรมในชุดประกอบหรือภาษาระดับสูงกว่าเช่น C ++ ซอร์สโค้ดถูกประกอบ (สำหรับรหัสแอสเซมบลี) หรือคอมไพล์ (สำหรับภาษาระดับสูงกว่า) ไปยังรหัสวัตถุและแต่ละโมดูลจะถูกเชื่อมโยงเข้าด้วยกันเพื่อให้กลายเป็นรหัสเครื่องสำหรับโปรแกรมสุดท้าย ในกรณีของโปรแกรมอย่างง่ายขั้นตอนการเชื่อมโยงอาจไม่จำเป็น ในกรณีอื่นเช่นเช่น IDE (สภาพแวดล้อมการพัฒนาแบบรวม) ตัวเชื่อมโยงและคอมไพเลอร์อาจถูกเรียกเข้าด้วยกัน ในกรณีอื่น ๆ ที่มีความซับซ้อนทำให้สคริปต์หรือวิธีการแก้ปัญหาไฟล์อาจถูกใช้เพื่อบอกสภาพแวดล้อมวิธีการสร้างแอพลิเคชันสุดท้าย
นอกจากนี้ยังมีภาษาตีความที่ทำงานแตกต่างกัน ภาษาที่แปลขึ้นอยู่กับรหัสเครื่องของโปรแกรมล่ามพิเศษ ในระดับพื้นฐานล่ามจะวิเคราะห์รหัสต้นฉบับและแปลงคำสั่งเป็นรหัสเครื่องใหม่ทันทีและดำเนินการคำสั่งเหล่านั้น ล่ามสมัยใหม่บางครั้งเรียกว่าสภาพแวดล้อมรันไทม์หรือเครื่องเสมือนมีความซับซ้อนมากขึ้น: การประเมินส่วนทั้งหมดของซอร์สโค้ดครั้งการแคชและการเพิ่มประสิทธิภาพที่เป็นไปได้และการจัดการงานการจัดการหน่วยความจำที่ซับซ้อน ภาษาที่แปลอาจรวบรวมไว้ล่วงหน้าเป็นภาษากลางระดับต่ำหรือ bytecode คล้ายกับรหัสแอสเซมบลี
คำตอบอื่น ๆ ให้คำอธิบายที่ดีเกี่ยวกับความแตกต่าง แต่คุณขอภาพด้วย นี่คือแผนภาพแสดงให้เห็นว่าพวกเขาเดินทางจากรหัส C ไปสู่การปฏิบัติการ
รหัสการประกอบเป็นรหัสที่มนุษย์สามารถอ่านได้ของเครื่อง:
mov eax, 77
jmp anywhere
รหัสเครื่องเป็นรหัสเลขฐานสิบหกบริสุทธิ์:
5F 3A E3 F1
ฉันถือว่าคุณหมายถึงรหัสวัตถุเช่นเดียวกับในวัตถุไฟล์ นี่คือความแตกต่างของรหัสเครื่องโดยมีความแตกต่างที่การกระโดดถูกเรียงลำดับของพารามิเตอร์เพื่อให้ linker สามารถเติมได้
แอสเซมเบลอร์จะใช้ในการแปลงรหัสแอสเซมบลีเป็นรหัสเครื่อง (รหัสวัตถุ) ตัวเชื่อมโยงเชื่อมโยงหลาย ๆ ไฟล์ออบเจ็กต์ (และไลบรารี) เพื่อสร้างไฟล์เรียกทำงาน
ฉันเคยเขียนโปรแกรมแอสเซมเบลอร์ใน hex บริสุทธิ์ (ไม่มีแอสเซมเบลอร์) ที่โชคดีนี่เป็นวิธีย้อนกลับไปสู่ยุคเก่าที่ดี (เก่า) 6502 แต่ฉันดีใจที่มีแอสเซมบลีสำหรับ Pentium opcodes
8B 5D 32
เป็นรหัสเครื่อง
mov ebx, [ebp+32h]
เป็นชุดประกอบ
lmylib.so
บรรจุ8B 5D 32
คือรหัสวัตถุ
ประเด็นหนึ่งที่ยังไม่ได้กล่าวถึงคือมีแอสเซมบลีโค้ดสองสามชนิดที่แตกต่างกัน ในรูปแบบพื้นฐานที่สุดตัวเลขทั้งหมดที่ใช้ในคำแนะนำจะต้องระบุว่าเป็นค่าคงที่ ตัวอย่างเช่น:
$ 1902: BD 37 14: LDA $ 1437, X $ 1905: 85 03: STA $ 03 $ 1907: 85 09: STA $ 09 $ 1909: CA: DEX $ 190A: 10: BPL $ 1902
บิตด้านบนของรหัสหากจัดเก็บที่ที่อยู่ $ 1900 ในตลับ Atari 2600 จะแสดงจำนวนบรรทัดในสีต่าง ๆ ที่ดึงมาจากตารางซึ่งเริ่มต้นที่ที่อยู่ $ 1437 ในเครื่องมือบางอย่างการพิมพ์ที่อยู่พร้อมกับส่วนด้านขวาสุดของบรรทัดด้านบนจะเก็บหน่วยความจำค่าที่แสดงในคอลัมน์กลางและเริ่มบรรทัดถัดไปด้วยที่อยู่ต่อไปนี้ การพิมพ์รหัสในรูปแบบนั้นสะดวกกว่าการพิมพ์แบบ hex แต่ต้องรู้ที่อยู่ที่ถูกต้องของทุกสิ่ง
แอสเซมบลีส่วนใหญ่อนุญาตให้หนึ่งเพื่อใช้ที่อยู่เป็นสัญลักษณ์ รหัสข้างต้นจะเขียนเหมือน:
rainbow_lp: lda ColorTbl, x sta WSYNC sta COLUBK Dex bpl rainbow_lp
แอสเซมเบลอร์จะปรับคำสั่ง LDA โดยอัตโนมัติดังนั้นมันจะอ้างถึงที่อยู่ใด ๆ ที่ถูกแมปกับฉลาก ColorTbl การใช้แอสเซมเบลอร์ลักษณะนี้ทำให้ง่ายต่อการเขียนและแก้ไขโค้ดมากกว่าที่จะเป็นไปได้หากมีการใช้กุญแจมือและบำรุงรักษาที่อยู่ทั้งหมด
ซอร์สโค้ด, รหัสแอสเซมบลี, รหัสเครื่อง, รหัสวัตถุ, รหัสไบต์, ไฟล์เรียกทำงานและไฟล์ Library
เงื่อนไขทั้งหมดเหล่านี้มักจะทำให้เกิดความสับสนมากสำหรับคนส่วนใหญ่ความจริงที่ว่าพวกเขาคิดว่าพวกเขาเป็นพิเศษร่วมกัน ดูแผนภาพเพื่อทำความเข้าใจความสัมพันธ์ของพวกเขา คำอธิบายของแต่ละคำศัพท์ได้รับด้านล่าง
คำแนะนำในภาษา (การเขียนโปรแกรม) ที่มนุษย์สามารถอ่านได้
คำแนะนำในภาษาระดับสูง (การเขียนโปรแกรม)
เช่นโปรแกรม
C, C ++ และ Java
คำแนะนำที่เขียนในภาษาแอสเซมบลี (ชนิดของภาษาการเขียนโปรแกรมระดับต่ำ) เป็นขั้นตอนแรกของกระบวนการรวบรวมรหัสระดับสูงจะถูกแปลงเป็นแบบฟอร์มนี้ เป็นรหัสชุดประกอบซึ่งจะถูกแปลงเป็นรหัสเครื่องจริง ในระบบส่วนใหญ่ขั้นตอนทั้งสองนี้จะดำเนินการโดยอัตโนมัติในฐานะเป็นส่วนหนึ่งของกระบวนการรวบรวม
เช่น program.asm
ผลิตภัณฑ์ของกระบวนการรวบรวม อาจอยู่ในรูปแบบของรหัสเครื่องหรือรหัสไบต์
เช่น file.o
คำแนะนำในภาษาเครื่อง
เช่น a.out
การเรียนการสอนในรูปแบบกลางซึ่งสามารถดำเนินการโดยล่ามเช่น JVM
เช่นไฟล์คลาส Java
ผลิตภัณฑ์ของการเชื่อมโยง proccess เป็นรหัสเครื่องที่สามารถใช้งาน CPU โดยตรง
เช่นไฟล์. exe
โปรดทราบว่าในบางบริบทไฟล์ที่มีคำสั่ง byte-code หรือภาษาสคริปต์อาจถูกพิจารณาว่าสามารถเรียกใช้งานได้
รหัสบางส่วนถูกรวบรวมในรูปแบบนี้ด้วยเหตุผลที่แตกต่างกันเช่นการใช้งานซ้ำและใช้ในภายหลังโดยไฟล์ปฏิบัติการ
cc1
ปฏิบัติการ) ฉันคิดว่าวงกลม asm ควรยื่นออกมาทางด้านซ้ายของวงกลม "ซอร์ส" เนื่องจากบาง asm เป็นเพียง asm ไม่ใช่แหล่งที่มา แน่นอนว่ามันไม่เคยมีรหัสวัตถุแต่ asm บางตัวเป็นขั้นตอนระหว่างทางจากซอร์สโค้ดไปยังอ็อบเจ็กต์ไฟล์
"ภาษาแอสเซมบลีเป็นภาษาระดับต่ำสำหรับการเขียนโปรแกรมคอมพิวเตอร์มันใช้การแสดงสัญลักษณ์ของรหัสเครื่องที่เป็นตัวเลขและค่าคงที่อื่น ๆ ที่จำเป็นสำหรับการเขียนโปรแกรมสถาปัตยกรรม CPU เฉพาะ"
"รหัสเครื่องหรือภาษาเครื่องเป็นระบบของคำสั่งและข้อมูลที่ดำเนินการโดยตรงโดยหน่วยประมวลผลกลางของคอมพิวเตอร์"
โดยทั่วไปรหัสแอสเซมเบลอร์เป็นภาษาและแปลเป็นรหัสวัตถุ (โค้ดเนมที่ซีพียูทำงาน) โดยแอสเซมเบลอร์ (คล้ายกับคอมไพเลอร์)
ฉันคิดว่านี่เป็นความแตกต่างที่สำคัญ
ความสามารถในการอ่านทำให้โค้ดปรับปรุงหรือทดแทนได้ 6 เดือนหลังจากสร้างขึ้นด้วยความพยายามน้อยหากประสิทธิภาพมีความสำคัญคุณอาจต้องการใช้ภาษาระดับต่ำเพื่อกำหนดเป้าหมายฮาร์ดแวร์เฉพาะที่คุณจะใช้งาน ดำเนินการเร็วขึ้น
คอมพิวเตอร์ IMO วันนี้เร็วพอที่จะให้โปรแกรมเมอร์ได้รับการดำเนินการอย่างรวดเร็วด้วย OOP
การประกอบเป็นคำอธิบายสั้น ๆ ที่มนุษย์สามารถเข้าใจได้ว่าสามารถแปลโดยตรงไปยังรหัสเครื่องที่ CPU ใช้จริง
ในขณะที่มนุษย์ค่อนข้างเข้าใจได้ Assembler ยังอยู่ในระดับต่ำ ใช้รหัสจำนวนมากเพื่อทำสิ่งที่มีประโยชน์
ดังนั้นเราจึงใช้ภาษาระดับสูงกว่าเช่น C, BASIC, FORTAN (ตกลงฉันรู้ว่าฉันลงวันที่เอง) เมื่อรวบรวมเหล่านี้ผลิตรหัสวัตถุ ภาษาแรกมีภาษาเครื่องเป็นรหัสวัตถุ
หลายภาษาในปัจจุบันเช่น JAVA และ C # มักจะรวบรวมเป็นรหัสไบต์ที่ไม่ใช่รหัสเครื่อง แต่ภาษาที่ตีความได้ง่ายในเวลาทำงานเพื่อสร้างรหัสเครื่อง
ซอร์สไฟล์ของโปรแกรมของคุณจะถูกคอมไพล์เป็นไฟล์ออบเจ็กต์จากนั้นตัวเชื่อมโยงจะลิงก์ไฟล์ออบเจ็กต์เหล่านั้นเข้าด้วยกันเพื่อสร้างไฟล์ปฏิบัติการรวมถึงรหัสเครื่องของสถาปัตยกรรมของคุณ
ทั้งอ็อบเจ็กต์ไฟล์และไฟล์ที่เรียกทำงานได้เกี่ยวข้องกับรหัสเครื่องของสถาปัตยกรรมในรูปแบบของอักขระที่พิมพ์ได้และไม่สามารถพิมพ์ได้เมื่อเปิดโดยตัวแก้ไขข้อความ
อย่างไรก็ตามความแตกต่างระหว่างไฟล์คือไฟล์วัตถุอาจมีการอ้างอิงภายนอกที่ไม่ได้แก้ไข (เช่นprintf
เป็นต้น) ดังนั้นจึงอาจจำเป็นต้องเชื่อมโยงกับไฟล์วัตถุอื่น ๆ .. กล่าวคือการอ้างอิงภายนอกที่ไม่ได้แก้ไขจำเป็นต้องได้รับการแก้ไขเพื่อให้ได้ไฟล์ปฏิบัติการที่เรียกใช้ได้ดีโดยเชื่อมโยงกับไฟล์วัตถุอื่นเช่นไลบรารีรันไทม์ C / C ++ .