บทที่ 5 โหลดเดอร์ (Loader) Loader
แอสเซมเบลอร์ และโหลดเดอร์ Source program ที่เป็นภาษาแอสเซมบลี้ ของผู้ใช้ จะถูกแปลงให้เป็น Object program (หรือภาษาเครื่อง) โดยตัว แอสเซมเบลอร์ ตัวโหลดเดอร์ ก็คือโปรแกรมที่ยอมรับ Object หรือภาษาเครื่องที่ได้ แล้วจัดการเตรียมส่งให้เครื่องคอมพิวเตอร์ทำงาน Loader
แสดงผังการทำงานทั่วไปของตัวโหลดเดอร์ A B LOADER DATABASE Loader
โหลดเดอร์ ทำหน้าที่ 4 อย่าง จัดหาที่ว่างในหน่วยความจำ เพื่อจะนำโปรแกรมไปใส่ในที่ว่างนั้น (Allocation) แก้ปัญหา การเชื่อมโยงแอดเดรสของสัญลักษณ์ต่างๆ (Symbolic references) ระหว่าง Objects (ที่มาจากแต่ละโปรแกรมย่อย) (Linking) ปรับตำแหน่งแอดเดรสที่ไม่อิสระทั้งหมด (เช่น แอดเดรสที่เป็นค่าคงที่ แอดเดรสที่ต้องอ้างอิงตารางอื่น) ให้สัมพันธ์กับที่ว่างในหน่วยความจำ ที่ได้จัดเตรียมไว้ (Relocation) วางภาษาเครื่อง (คำสั่ง และข้อมูล) ลงไปในหน่วยความจำ (Loading) Loader
Segment เป็นหน่วยของสารสนเทศที่ป้อนเข้าไป ซึ่งอาจจะเป็นข้อมูล หรือโปรแกรมก็ได้ (Data or Program) โดยปกติ Segment หมายถึง แหล่งข้อมูลชุดเดียว หรือ Object ชุดเดียว Loader
“Compile-and-Go” Loader Source Program Deck Compile-and-go Translator (e.g. assembler) Loaded In Memory Assembler Loader
“Compile-and-Go” Loader คอมไพล์ หรือแอสเซมเบิลเสร็จ ก็ให้โปรแกรมทำงานเลย ตัวแอสเซมเบลอร์จะวางภาษาเครื่องที่ได้ลงในหน่วยความจำ และตัวโหลดเดอร์ (ซึ่งประกอบด้วยเพียงคำสั่งเดียว) จะทำหน้าที่บอกแอดเดรสเริ่มต้นของโปรแกรมภาษาเครื่องในหน่วยความจำนั้น เพื่อให้เครื่องเริ่มทำงานที่แอดเดรสเริ่มต้นนั้น ง่ายต่อการออกแบบและเขียนโปแกรม Loader
ข้อเสีย บางส่วนของหน่วยความจำต้องสูญเสียไปเพราะว่าตัวแอสเซมเบลอร์ต้องถูกใช้งานด้วย จะต้องแปลงภาษาแอสเซมบลี้ ให้เป็นภาษาเครื่องทุกครั้ง ที่จะทำการ Run โปรแกรม ในกรณีที่โปรแกรมมีหลาย Segments (เช่น มีหลายโปรแกรมย่อย หรือ Source program มาจากหลายภาษาที่ต่างกัน ) โหลดเดอร์วิธีนี้จะไม่สามารถทำได้ Loader
โหลดเดอร์ที่ใช้งานโดยทั่วไป Source Program Translator Object Programs Ready for Execution Loader Program 1 Program 2 Loader
โหลดเดอร์ที่ใช้งานโดยทั่วไป แทนที่เราจะเอาภาษเครื่องที่ได้ลงไปไว้ในหน่วยความจำ เราก็เอาไปเก็บไว้ในหน่วยความจำสำรองก่อน (เช่น ดิสก์ เป็นต้น) จะทำการโหลดมาไว้ในหน่วยความจำหลัก ก็เฉพาะตอนที่เราจะทำการ Run โปรแกรม เราสามารถโหลดโปรแกรมภาษาเครื่อง ลงแทนที่พื้นที่เดิมของตัวแอสเซมเบลอร์ได้ ถ้าภาษาเครื่องที่ได้จากตัวแอสเซมเบลอร์ หรือตัวคอมไพเลอร์ อยู่ใน Format เดียวกัน ใช้ข้อตกลงการ Link โปรแกรมร่วมกัน ก็จะทำให้สามารถ เขียนโปรแกรมย่อย ที่มาจากภาษาที่แตกต่างกันได้ (เช่น ภาษา C หรือปาสคาล เป็นต้น) Loader
โหลดเดอร์ชนิด แอบโซลุท (Absolute Loader) ง่ายต่อการออกแบบและเขียนโปรแกรม ภาษาเครื่องที่ได้จากตัวแอสเซมเบลอร์จะเกือบเหมือนกับวิธี Assemble-and-Go เพียงแต่ภาษาเครื่องที่ได้ จะถูกเก็บลงในดิสก์ก่อน แทนที่จะส่งไปหน่วยความจำโดยตรง วิธีนี้จะเหลือพื้นที่ในหน่วยความจำไว้ใช้งานเยอะ เพราะตัวแอสเซมเบลอร์ ไม่จำเป็นต้องอยู่ในหน่วยความจำในช่วงของการโหลด Loader
FROM ABSOLUTE ASSEMBLER Location Instruction 100 BALR 12,0 102 : : : MAIN program MAIN START 100 BALR 12,0 USING MAIN+2,12 : L 15,ASQRT call BALR 14,15 SQRT ASQRT DC F’400’ address OF SQRT END SQRT subroutine SQRT START 400 USING *,15 : compute square root BR 14 OBJECT DECK OUTPUT FROM ABSOLUTE ASSEMBLER Location Instruction 100 BALR 12,0 102 : : : 120 L 15,142(0,12) 124 BALR 14,15 126 : 244 F’400’ 248 400 476 BCR 15,14 Loader
ตัวอย่างของโหลดเดอร์ชนิด แอบโซลุท MAIN SQRT Object decks Absolute Loader 100 248 400 478 Loader
ข้อเสีย โปรแกรมเมอร์ ต้องกำหนดแอดเดรสในหน่วยความจำของโปรแกรม ให้กับตัวแอสเซมเบลอร์ ว่าโปรแกรม จะถูกโหลดลงที่แอดเดรสไหน ถ้าโปรแกรมนั้น มีหลายโปรแกรมย่อย โปรแกรมเมอร์ต้องจำแอดเดรสของแต่ละโปรแกรมย่อย และอ้างแอดเดรสแบบแอบโซลุทให้ตรงกัน ในแต่ละโปรแกรมย่อยเหล่านั้นในช่วงของการ Link โปรแกรมเมอร์ต้องระวังเรื่องแอดเดรส โดยต้องไม่กำหนดให้สองโปรแกรมย่อยวางทับกัน Loader
หน้าที่ของตัวโหลดเดอร์ 4 อย่าง ในกรณีของโหลดเดอร์ ชนิดแอบโซลุท หน้าที่ของตัวโหลดเดอร์ 4 อย่าง ในกรณีของโหลดเดอร์ ชนิดแอบโซลุท Allocation -- ทำโดยโปรแกรมเมอร์ Linking -- ทำโดยโปรแกรมเมอร์ Relocation -- ทำโดยตัวแอสเซมเบลอร์ Loading -- ทำโดยตัวโหลดเดอร์ Loader
การ Link ระหว่างโปรแกรมย่อย (Subroutine Linkage) เมื่อโปรแกรมหลัก A ต้องการเรียกโปรแกรมย่อย B เราสามารถใช้คำสั่ง ในการกระโดดออกจาก A ไปยังโปรแกรมย่อย B ได้ (เช่นคำสั่ง BAL 14,B) Branch and link อย่างไรก็ตาม ตัวแอสเซมเบลอร์ไม่รู้ว่าตำแหน่งที่จะกระโดดไปนั้นอยู่ที่ไหน เช่น กรณีแอดเดรสของ B ตัวแอสเซมเบลอร์จะแสดงข้อความบอกว่า เกิด ERROR ขึ้นมาเช่น ไม่มีการกำหนดสัญลักษณ์มาก่อน (Undefined symbol) เว้นแต่ว่าเราจะมีคำสั่งพิเศษอย่างอื่นมาช่วย เช่น EXTRN และ ENTRY Loader
ตัวอย่าง MAIN START --- L 15,=A(B) call B BALR 14,15 : END EXTRN B 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 EXTRN C : 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