220 likes | 356 Views
บทที่ 5. โหลดเดอร์ (Loader). แอสเซมเบลอร์ และโหลดเดอร์. Source program ที่เป็นภาษาแอสเซมบลี้ ของผู้ใช้ จะถูกแปลงให้เป็น Object program ( หรือภาษาเครื่อง) โดยตัว แอสเซมเบลอร์ ตัวโหลดเดอร์ ก็คือโปรแกรมที่ยอมรับ Object หรือภาษาเครื่องที่ได้ แล้วจัดการเตรียมส่งให้เครื่องคอมพิวเตอร์ทำงาน. A.
E N D
บทที่ 5 โหลดเดอร์ (Loader) Loader
แอสเซมเบลอร์ และโหลดเดอร์ • Source program ที่เป็นภาษาแอสเซมบลี้ ของผู้ใช้ จะถูกแปลงให้เป็น Object program (หรือภาษาเครื่อง) โดยตัว แอสเซมเบลอร์ • ตัวโหลดเดอร์ ก็คือโปรแกรมที่ยอมรับ Object หรือภาษาเครื่องที่ได้ แล้วจัดการเตรียมส่งให้เครื่องคอมพิวเตอร์ทำงาน Loader
A LOADER A B B DATABASE แสดงผังการทำงานทั่วไปของตัวโหลดเดอร์ Loader
โหลดเดอร์ ทำหน้าที่ 4 อย่าง • จัดหาที่ว่างในหน่วยความจำ เพื่อจะนำโปรแกรมไปใส่ในที่ว่างนั้น (Allocation) • แก้ปัญหา การเชื่อมโยงแอดเดรสของสัญลักษณ์ต่างๆ (Symbolic references) ระหว่าง Objects (ที่มาจากแต่ละโปรแกรมย่อย) (Linking) • ปรับตำแหน่งแอดเดรสที่ไม่อิสระทั้งหมด (เช่น แอดเดรสที่เป็นค่าคงที่ แอดเดรสที่ต้องอ้างอิงตารางอื่น) ให้สัมพันธ์กับที่ว่างในหน่วยความจำ ที่ได้จัดเตรียมไว้ (Relocation) • วางภาษาเครื่อง (คำสั่ง และข้อมูล) ลงไปในหน่วยความจำ (Loading) Loader
Segment • เป็นหน่วยของสารสนเทศที่ป้อนเข้าไป ซึ่งอาจจะเป็นข้อมูล หรือโปรแกรมก็ได้ (Data or Program) โดยปกติ Segment หมายถึง แหล่งข้อมูลชุดเดียว หรือ Object ชุดเดียว Loader
Source Program Deck Compile-and-go Translator (e.g. assembler) Program Loaded In Memory Assembler “Compile-and-Go”Loader Loader
“Compile-and-Go”Loader • คอมไพล์ หรือแอสเซมเบิลเสร็จ ก็ให้โปรแกรมทำงานเลย • ตัวแอสเซมเบลอร์จะวางภาษาเครื่องที่ได้ลงในหน่วยความจำ และตัวโหลดเดอร์ (ซึ่งประกอบด้วยเพียงคำสั่งเดียว) จะทำหน้าที่บอกแอดเดรสเริ่มต้นของโปรแกรมภาษาเครื่องในหน่วยความจำนั้น เพื่อให้เครื่องเริ่มทำงานที่แอดเดรสเริ่มต้นนั้น • ง่ายต่อการออกแบบและเขียนโปแกรม Loader
ข้อเสีย • บางส่วนของหน่วยความจำต้องสูญเสียไปเพราะว่าตัวแอสเซมเบลอร์ต้องถูกใช้งานด้วย • จะต้องแปลงภาษาแอสเซมบลี้ ให้เป็นภาษาเครื่องทุกครั้ง ที่จะทำการ Run โปรแกรม • ในกรณีที่โปรแกรมมีหลาย Segments (เช่น มีหลายโปรแกรมย่อย หรือ Source program มาจากหลายภาษาที่ต่างกัน ) โหลดเดอร์วิธีนี้จะไม่สามารถทำได้ Loader
Source Program Translator Object Program 1 Loader Object Programs Ready for Execution Source Program Translator Object Program 2 Loader โหลดเดอร์ที่ใช้งานโดยทั่วไป Loader
โหลดเดอร์ที่ใช้งานโดยทั่วไปโหลดเดอร์ที่ใช้งานโดยทั่วไป • แทนที่เราจะเอาภาษเครื่องที่ได้ลงไปไว้ในหน่วยความจำ เราก็เอาไปเก็บไว้ในหน่วยความจำสำรองก่อน (เช่น ดิสก์ เป็นต้น) • จะทำการโหลดมาไว้ในหน่วยความจำหลัก ก็เฉพาะตอนที่เราจะทำการ Run โปรแกรม • เราสามารถโหลดโปรแกรมภาษาเครื่อง ลงแทนที่พื้นที่เดิมของตัวแอสเซมเบลอร์ได้ • ถ้าภาษาเครื่องที่ได้จากตัวแอสเซมเบลอร์ หรือตัวคอมไพเลอร์ อยู่ใน Format เดียวกัน ใช้ข้อตกลงการ Link โปรแกรมร่วมกัน ก็จะทำให้สามารถ เขียนโปรแกรมย่อย ที่มาจากภาษาที่แตกต่างกันได้ (เช่น ภาษา C หรือปาสคาล เป็นต้น) Loader
โหลดเดอร์ชนิด แอบโซลุท (Absolute Loader) • ง่ายต่อการออกแบบและเขียนโปรแกรม • ภาษาเครื่องที่ได้จากตัวแอสเซมเบลอร์จะเกือบเหมือนกับวิธี Assemble-and-Go เพียงแต่ภาษาเครื่องที่ได้ จะถูกเก็บลงในดิสก์ก่อน แทนที่จะส่งไปหน่วยความจำโดยตรง • วิธีนี้จะเหลือพื้นที่ในหน่วยความจำไว้ใช้งานเยอะ เพราะตัวแอสเซมเบลอร์ ไม่จำเป็นต้องอยู่ในหน่วยความจำในช่วงของการโหลด Loader
MAIN 100 MAIN 248 400 SQRT 478 Absolute Loader SQRT Object decks ตัวอย่างของโหลดเดอร์ชนิด แอบโซลุท Loader
ข้อเสีย • โปรแกรมเมอร์ ต้องกำหนดแอดเดรสในหน่วยความจำของโปรแกรม ให้กับตัวแอสเซมเบลอร์ ว่าโปรแกรม จะถูกโหลดลงที่แอดเดรสไหน • ถ้าโปรแกรมนั้น มีหลายโปรแกรมย่อย โปรแกรมเมอร์ต้องจำแอดเดรสของแต่ละโปรแกรมย่อย และอ้างแอดเดรสแบบแอบโซลุทให้ตรงกัน ในแต่ละโปรแกรมย่อยเหล่านั้นในช่วงของการ Link • โปรแกรมเมอร์ต้องระวังเรื่องแอดเดรส โดยต้องไม่กำหนดให้สองโปรแกรมย่อยวางทับกัน Loader
หน้าที่ของตัวโหลดเดอร์ 4 อย่าง ในกรณีของโหลดเดอร์ ชนิดแอบโซลุท • Allocation -- ทำโดยโปรแกรมเมอร์ • Linking -- ทำโดยโปรแกรมเมอร์ • Relocation -- ทำโดยตัวแอสเซมเบลอร์ • Loading -- ทำโดยตัวโหลดเดอร์ Loader
การ Link ระหว่างโปรแกรมย่อย (Subroutine Linkage) • ปัญหาของการ Link ระหว่างโปรแกรมย่อยก็คือ • เมื่อโปรแกรมหลัก A ต้องการเรียกโปรแกรมย่อย B • เราสามารถใช้คำสั่ง ในการกระโดดออกจาก A ไปยังโปรแกรมย่อย B ได้ (เช่นคำสั่ง BAL 14,B) • อย่างไรก็ตาม ตัวแอสเซมเบลอร์ไม่รู้ว่าตำแหน่งที่จะกระโดดไปนั้นอยู่ที่ไหน • เช่น กรณีแอดเดรสของ B ตัวแอสเซมเบลอร์จะแสดงข้อความบอกว่า เกิด ERROR ขึ้นมาเช่น ไม่มีการกำหนดสัญลักษณ์มาก่อน (Undefined symbol) • เว้นแต่ว่าเราจะมีคำสั่งพิเศษอย่างอื่นมาช่วย เช่น EXTRN และ ENTRY Loader
ตัวอย่าง Loader
EXTRN • คำสั่งประเภท Pseudo-op ตามด้วยสัญลักษณ์ บอกให้รู้ว่าสัญลักษณ์เหล่านั้นถูกกำหนด (หรือประกาศการใช้) ในโปรแกรมอื่น แต่ถูกเรียกใช้ในโปรแกรมนี้ Loader
ENTRY • ถ้าสัญลักษณ์ถูกกำหนดในโปรแกรมนี้ และถูกเรียกใช้โดยโปรแกรมอื่นๆ • เป็นคำสั่งประเภท Pseudo-op Loader
ตัวอย่าง ASSEMBLER LINKAGE PSEUDO-OPS Subroutine and Entry Naming (START and ENTRY Pseudo-ops) A START defines subroutine A. ENTRY B1,B2,B3,… defines locations B1,…,Bn As additional subroutine entry points : B1 --- B2 --- Loader
โปรแกรมย่อยโดยทั่วไปจะมีลักษณะดังนี้โปรแกรมย่อยโดยทั่วไปจะมีลักษณะดังนี้ BETA START USING *,15 : : BR 14 END Loader
การอ้างแอดเดรสระหว่างโปรแกรมย่อย โดยการใช้ EXTRN CALL BETA กลายเป็น EXTRN BETA : L 15, ABETA BALR 14,15 : ABETA DC A(BETA) Loader