คำนำหน้าส่วนของโปรแกรม

Program Segment Prefix (PSP) เป็นโครงสร้างข้อมูลที่ใช้ใน ระบบ DOSเพื่อจัดเก็บสถานะของโปรแกรมคล้ายกับZero PageในระบบปฏิบัติการCP/M PSP มีโครงสร้างดังต่อไปนี้:

ออฟเซ็ต ขนาด สารบัญ
00.00 น.–01.01 น 2 ไบต์ (รหัส) CP/M-80 -เหมือนทางออก (มีINT 20h เสมอ ) [1] [2]
02น.–03น คำ (2 ไบต์) ส่วนของไบต์แรกที่อยู่นอกเหนือหน่วยความจำที่จัดสรรให้กับโปรแกรม
04ชม ไบต์ ที่สงวนไว้
05.00-09.00 น 5 ไบต์ (รหัส) รายการโทรระยะไกลที่คล้ายกับ CP/M-80 ใน DOS และขนาดส่วนของโปรแกรม [1] [3]
0Ah–0Dh dword (4 ไบต์) ยุติที่อยู่ของโปรแกรมก่อนหน้า (INT เก่า 22 ชม.)
0เอ๊ะ–11ชม คำ ที่อยู่พักของโปรแกรมก่อนหน้า (INT เก่า 23 ชม.)
12.00-15.00 น คำ ที่อยู่ข้อผิดพลาดที่สำคัญของโปรแกรมก่อนหน้า (INT เก่า 24 ชม.)
16.00-17.00 น คำ ส่วน PSP ของผู้ปกครอง (โดยปกติคือCOMMAND.COM - ภายใน)
18ชม.–2บ 20 ไบต์ ตารางไฟล์งาน (JFT) (ภายใน)
2Ch–2Dh คำ ส่วน สิ่งแวดล้อม
2เอห์–31น คำ SS:SP เมื่อเข้าสู่ การโทร INT 21 ชม. ล่าสุด (ภายใน)
32ชม.–33ชม คำ ขนาด JFT (ภายใน)
34 ชม.–37 ชม คำ ตัวชี้ไปที่ JFT (ภายใน)
38ชม.–3บ คำ ตัวชี้ไปยัง PSP ก่อนหน้า (ใช้โดย SHARE ใน DOS 3.3 และใหม่กว่าเท่านั้น)
3Ch–3Fh 4 ไบต์ ที่สงวนไว้
40ชม.–41ชม คำ เวอร์ชัน DOS ที่จะกลับมา (DOS 5 และใหม่กว่า เปลี่ยนแปลงได้ผ่าน SETVER ใน DOS 5 และใหม่กว่า)
42h–4Fh 14 ไบต์ ที่สงวนไว้
50ชม.–52ชม 3 ไบต์ (รหัส) Unix - เหมือนรายการโทรระยะไกลใน DOS (ประกอบด้วย INT 21h + RETF เสมอ)
53 ชม.–54 ชม 2 ไบต์ ที่สงวนไว้
55ชม.–5บ 7 ไบต์ สงวนไว้ (สามารถใช้เพื่อทำให้ FCB แรกเป็น FCB แบบขยายได้)
5Ch–6Bh 16 ไบต์ FCBมาตรฐานที่ยังไม่ได้เปิด1
6Ch–7Fh 20 ไบต์ มาตรฐาน FCB 2 ที่ยังไม่ได้เปิด (เขียนทับหากเปิด FCB 1)
80ชม 1 ไบต์ จำนวนไบต์บนบรรทัดคำสั่ง
81 ชม.–FFh 127 ไบต์ ส่วนท้ายของบรรทัดคำสั่ง (สิ้นสุดด้วย0Dh ) [4] [5]

PSP มักใช้เพื่อรับอาร์กิวเมนต์บรรทัดคำสั่งของโปรแกรม DOS; ตัวอย่างเช่น คำสั่ง "FOO.EXE /A /F" ดำเนินการ FOO.EXE ด้วยอาร์กิวเมนต์ '/A' และ '/F'

หากรายการ PSP สำหรับความยาวบรรทัดคำสั่งไม่เป็นศูนย์ และตัวชี้ไปยังส่วนของสภาพแวดล้อมไม่ใช่ทั้ง 0000h หรือ FFFFh โปรแกรมควรลองดึงบรรทัดคำสั่งจากตัวแปรสภาพแวดล้อม %CMDLINE%ก่อนที่จะแยกออกจาก PSP ด้วยวิธีนี้ จึงสามารถส่งบรรทัดคำสั่งที่ยาวเกิน 126 อักขระไปยังแอปพลิเคชันได้

ที่อยู่ส่วนของ PSP จะถูกส่งผ่านไปยังการลงทะเบียน DS เมื่อโปรแกรมถูกดำเนินการ นอกจากนี้ยังสามารถกำหนดได้ในภายหลังโดยใช้ฟังก์ชัน Int 21h 51h หรือ Int 21h ฟังก์ชัน 62h ฟังก์ชันใดฟังก์ชันหนึ่งจะส่งคืนที่อยู่ PSP ในรีจิสเตอร์ BX [6]

อีกทางหนึ่ง ใน โปรแกรม .COMที่โหลดที่ offset 100hเราสามารถจัดการ PSP ได้โดยตรงโดยใช้ออฟเซ็ตที่กล่าวข้างต้น ออฟเซ็ต000hชี้ไปที่จุดเริ่มต้นของ PSP 0FFhชี้ไปที่จุดสิ้นสุด ฯลฯ

ตัวอย่างเช่น รหัสต่อไปนี้แสดงอาร์กิวเมนต์บรรทัดคำสั่ง:

องค์กร100h ; .COM - ไม่ได้ใช้ ds         

- ฟังก์ชันย่อย INT 21h 9 ต้องใช้ '$' เพื่อยุติสตริง
xor bx , bx mov bl ,[ 80h ] cmp bl , 7Eh ja exit ; ป้องกันการล้น   
   
   
          

mov ไบต์[ bx + 81h ], '$'    

- พิมพ์สตริง
mov ah , 9 mov dx , 81h int 21h   
   
   

ออก: 
ขวานmov , 4C00h ; ฟังก์ชั่นย่อย 4C int 21 ชม     
   

ใน DOS 1.x จำเป็นสำหรับการลงทะเบียน CS (Code Segment) ที่จะต้องมีเซ็กเมนต์เดียวกันกับ PSP เมื่อโปรแกรมสิ้นสุด ดังนั้นการฝึกเขียนโปรแกรมมาตรฐานจึงเกี่ยวข้องกับการบันทึก DS register (เนื่องจาก DS register ถูกโหลดด้วยเซ็กเมนต์ PSP) พร้อมกับใส่คำเป็นศูนย์ลงในสแต็กเมื่อโปรแกรมเริ่มต้นและสิ้นสุดโปรแกรมด้วยคำสั่ง RETF ซึ่งจะแสดงค่าส่วนที่บันทึกไว้ออกจากสแต็กและข้ามไปยังที่อยู่ 0 ของ PSP ซึ่งมีคำสั่ง INT 20h

- บันทึก
push ds xor ax , ax push ax  
   
  

- ย้ายไปยังกลุ่มข้อมูลเริ่มต้น (@data) 
mov ax , @ data mov ds , ax   
   

- พิมพ์ข้อความใน Mess1 (ฟังก์ชันย่อย 21 ชม. 9) 
mov dx , Mess1 mov ah , 9 int 21h   
   
   

รีฟ

หากไฟล์ปฏิบัติการเป็นไฟล์ .COM ขั้นตอนนี้ไม่จำเป็น และโปรแกรมสามารถยุติได้ด้วยคำสั่ง INT 20h โดยตรง หรือเรียกฟังก์ชัน INT 21h 0 อย่างไรก็ตาม โปรแกรมเมอร์ยังคงต้องตรวจสอบให้แน่ใจว่าการลงทะเบียน CS มีที่อยู่เซกเมนต์ ของ PSP เมื่อสิ้นสุดโปรแกรม ดังนั้น,

เจเอ็มพีเริ่มต้น   

Mess1 db 'สวัสดีชาวโลก!$'  

เริ่มต้น: 
mov dx , Mess1 mov ah , 9 int 21h   
   
   

ภายใน20 ชม   

ใน DOS 2.x และสูงกว่า การยกเลิกโปรแกรมทำได้สำเร็จแทนด้วยฟังก์ชัน INT 21h 4Ch ซึ่งไม่จำเป็นต้องใช้ CS register เพื่อให้มีค่าเซ็กเมนต์ของ PSP

ดูสิ่งนี้ด้วย

อ้างอิง

  1. ↑ อับ เทย์เลอร์, โรเจอร์; เลมมอนส์, ฟิล (มิถุนายน 1982) "การโยกย้ายที่สูงขึ้น - ส่วนที่ 1: นักแปล - การใช้โปรแกรมการแปลเพื่อย้ายโปรแกรม CP/M-86 ไปยัง CP/M และ MS-DOS" [การใช้โปรแกรมการแปลเพื่อย้ายโปรแกรม CP/M ไปยัง CP/M-86 และ MS-DOS] (ไฟล์ PDF) . ไบต์ ​ฉบับที่ 7, ไม่. 6. BYTE Publications Inc.หน้า 321–322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344 [342, 344] ISSN  0360-5280. รหัส  BYTEDJ Archived (PDF)จากต้นฉบับเมื่อ 2020-01-16 . สืบค้นเมื่อ 2020-01-15 . […] การเข้าถึงCP/M-86 […] การเข้าถึง CP/M-86 จำเป็นต้องวางโค้ดฟังก์ชันในรีจิสเตอร์ CL วางพารามิเตอร์ไบต์ในรีจิสเตอร์ DL หรือวางพารามิเตอร์คำในรีจิสเตอร์ DX การวางส่วนข้อมูลในการลงทะเบียน DS (โดยปกติส่วนข้อมูลจะไม่เปลี่ยนแปลงสำหรับโปรแกรมที่แปลงแล้ว) และดำเนินการขัดจังหวะซอฟต์แวร์INT # 224 ผลลัพธ์จะถูกส่งกลับในการลงทะเบียน AL หากเป็นค่าไบต์ หากผลลัพธ์เป็นค่าคำ ก็จะถูกส่งกลับทั้งในรีจิสเตอร์ AX และ BX ค่าคำสองคำจะถูกส่งกลับพร้อมกับออฟเซ็ตในรีจิสเตอร์ BX และเซ็กเมนต์ในรีจิสเตอร์ ES การแปลงโปรแกรมจากCP/M-80เป็น CP/M-86 จำเป็นต้องเปลี่ยนการเรียกไปยังตำแหน่ง 5 ด้วยซอฟต์แวร์ขัดจังหวะ INT #224 การเปลี่ยนแปลงที่จำเป็นอีก ประการหนึ่งเกี่ยวข้องกับการวอร์มบูตภายใต้ CP/M-80 การวอร์มบูตอาจสามารถเข้าถึงได้โดยการเรียกของระบบด้วยโค้ดฟังก์ชัน 0 สำหรับการข้ามไปยังตำแหน่ง 0 อย่างไรก็ตาม CP/M-86 ไม่สนับสนุนการข้ามไปยังตำแหน่ง 0 ด้วยเหตุนี้ คุณต้องเปลี่ยนทางออกของโปรแกรมนี้ในโปรแกรมที่แปลแล้วหากโปรแกรมทำงานอย่างถูกต้อง โดยมีเงื่อนไขว่าการเรียกไปยังตำแหน่ง 5 ถูกแทนที่ด้วย INT #224 ว่าได้ทำการเปลี่ยนแปลงวอร์มบูต และรีจิสเตอร์ถูกแมปอย่างถูกต้อง ควรมีปัญหาเล็กน้อยในการรับโปรแกรมที่แปลแล้วเพื่อเข้าถึงฟังก์ชันระบบ CP/M-86 . […] การเข้าถึงMS-DOS […] แม้ว่า MS-DOS จะมีกลไก "ที่ต้องการ" ผ่านการขัดจังหวะซอฟต์แวร์INT #33สำหรับการเข้าถึงระบบ แต่ก็มีกลไกเพิ่มเติมสำหรับโปรแกรม "ที่มีอยู่แล้ว" ที่ เข้ากันได้กับรูปแบบการเรียก CP/M-80 อย่างน้อยสำหรับฟังก์ชันในช่วง 0-36 สำหรับการเรียกใช้ระบบภายในช่วงฟังก์ชันที่อนุญาต โปรแกรมเมอร์ไม่จำเป็นต้องทำอะไรกับโปรแกรมที่แปลแล้วเพื่อให้โปรแกรมทำงานภายใต้ MS-DOS นอกเหนือจากการแมปรีจิสเตอร์อย่างถูกต้อง MS-DOS ยังรองรับฟังก์ชันวอร์มบูตของ CP/M-80 การข้ามไปยังตำแหน่ง 0 ภายใต้ MS-DOS จะเรียกใช้งานซอฟต์แวร์ขัดจังหวะINT #32ซึ่งเป็นฟังก์ชันการสิ้นสุดโปรแกรมและเป็นวิธีปกติในการออกจากโปรแกรม -[1] [2][3][4][5][6][7][8][9][10][11][12][13][14] (13 หน้า)
  2. พอล, แมทเธียส อาร์. (2002-10-07) [2000]. "Re: เรียกใช้ไฟล์ COM" กลุ่มข่าวสาร : alt.msdos.programmer เก็บถาวรจากต้นฉบับเมื่อ 2017-09-03 . สืบค้นเมื่อ 2017-09-03 .[15] (หมายเหตุ มีรายละเอียดเกี่ยวกับระเบียบการเรียกโปรแกรม DOS COM)
  3. เนคาเซค, มิคาล (2011-09-13) “ใครต้องการสรุปที่อยู่ล่ะ?” พิพิธภัณฑ์ OS/2 . เก็บถาวรจากต้นฉบับเมื่อ 2020-02-19 . สืบค้นเมื่อ 2020-02-19 . […] 86-DOSและด้วยเหตุนี้PC DOS / MS-DOSจึงใช้กลอุบายอันชาญฉลาด ไบต์ที่ออฟเซ็ต 5 ของ PSP มี opcode การเรียกไกล (9Ah); คำที่ออฟเซ็ต 6 ของ PSP มีค่าที่เหมาะสมเพื่อระบุขนาดส่วนของโปรแกรม และรวมถึงส่วนออฟเซ็ตของการเรียกไกลด้วย คำที่ออฟเซ็ต 8 ซึ่งทำหน้าที่เป็นส่วนของเซกเมนต์ของการเรียกไกล ได้รับการประดิษฐ์ขึ้นเพื่อให้เมื่อรวมกับออฟเซ็ต คำนั้นจะล้อมรอบ (คุณลักษณะที่เข้าใจกันดีของ CPU 8086 ) และชี้ไปยังที่อยู่ 0:C0h ซึ่ง มีเวกเตอร์อินเตอร์รัปต์ 30 ชม. […] อินเทอร์เฟซ CALL 5 ใช้งานได้แม้ในการจำลอง DOS ภายใต้ Windows NT และ OS/2 และระบบเหล่านั้นไม่สามารถทำงานได้โดย ปิดใช้งานสาย A20แน่นอนแล้วมันทำงานยังไงล่ะ? […] แทนที่จะตัดบิตที่อยู่ออก ระบบจะมิเรอร์ห้าไบต์ที่ 0:C0h ที่ 1,000C0h ในความเป็นจริงแล้วเทคนิคเดียวกันนี้ใช้ใน DOS 5 ขึ้นไปและทำงานกับDOS= HIGH ในกรณีนั้น DOS จะตรวจสอบให้แน่ใจว่าที่อยู่เชิงเส้น 1000C0h มีการเรียกไกลที่เหมาะสม -
  4. พอล, แมทเธียส อาร์. (1997-07-01) [1994-01-01]. MSDOSTIPs — คำแนะนำสำหรับ MS-DOS 5.0-7 (ในภาษาเยอรมัน) เก็บถาวรจากต้นฉบับเมื่อ 2017-08-22 . ดึงข้อมูลเมื่อ 25-10-2556 . {{cite book}}: |work=ละเว้น ( help ) (NB MSDOSTIP.TXT เป็นส่วนหนึ่งของ MPDOSTIP.ZIP ซึ่งได้รับการปรับปรุงจนถึงปี 2001 และเผยแพร่ในหลายไซต์ในขณะนั้น ลิงก์ที่ให้มาชี้ไปยังไฟล์ MSDOSTIP.TXT เวอร์ชันเก่าที่แปลงเป็น HTML) [16]
  5. พอล, แมทเธียส อาร์. (1997-05-01) [1995-03-01]. "รองรับ JPSofts 4DOS 5.5b/c, 5.51, 5.52a และ NDOS" MPDOSTIP (ภาษาเยอรมัน) เก็บถาวรจากต้นฉบับเมื่อ 2016-11-04 . สืบค้นเมื่อ2015-05-08 .(หมายเหตุ ลิงก์ที่ให้มาชี้ไปยังไฟล์เวอร์ชันที่แปลง HTML 4DOS5TIP.TXTซึ่งเป็นส่วนหนึ่งของMPDOSTIP.ZIPคอลเล็กชัน) [17]
  6. "INT 21h,62h - รับที่อยู่ PSP (DOS 3.x)" เก็บถาวรจากต้นฉบับเมื่อ 2012-02-07
  7. ↑ เอบีซี ชูลมาน, แอนดรูว์; บราวน์, ราล์ฟ ดี. ; แม็กซีย์, เดวิด; มิเชลส์, เรย์มอนด์ เจ.; ไคล์, จิม (1994) [พฤศจิกายน 1993] DOS ที่ไม่มีเอกสาร: คู่มือโปรแกรมเมอร์เกี่ยวกับฟังก์ชัน MS-DOS และโครงสร้างข้อมูลที่สงวนไว้ - ขยายเพื่อรวม MS-DOS 6, Novell DOS และ Windows 3.1 (2 ed.) เรดดิ้ง, แมสซาชูเซตส์, สหรัฐอเมริกา: แอดดิสัน เวสลีย์ . ไอเอสบีเอ็น 0-201-63287-เอ็กซ์-(หน้า xviii+856+vi, 3.5"-ฟล็อปปี้ดิสก์) คลาดเคลื่อน: [18][19]

อ่านเพิ่มเติม

  • 86-DOS - ระบบปฏิบัติการดิสก์สำหรับ 8086 - คู่มือโปรแกรมเมอร์(PDF ) เวอร์ชัน 0.3 (ฉบับเบื้องต้น) ซีแอตเทิล, วอชิงตัน, สหรัฐอเมริกา: Seattle Computer Products, Inc. 1980. เก็บถาวรจากต้นฉบับ(PDF)เมื่อ23-06-2019 ดึงข้อมูลเมื่อ2011-09-13 .(41 หน้า)
  • "รูปแบบของคำนำหน้าส่วนของโปรแกรม (PSP)" อินเตอร์61 . 2000. เก็บถาวรจากต้นฉบับเมื่อ 2020-02-17 . สืบค้นเมื่อ 2019-12-19 .
  • เชเปอร์ส, อาร์เน่ (1991) บทที่ 5: EXEC ในรายละเอียด - คำนำหน้ากลุ่มโปรแกรม (PSP) DOS 5 für Programmierer: Die endgültige Referenz (ภาษาเยอรมัน) (ฉบับพิมพ์ครั้งที่ 1) แอดดิสัน เวสลีย์ (ดอยช์แลนด์) GmbH หน้า 148–151, 971–972. ไอเอสบีเอ็น 3-89319-350-2-(1123+หน้า, พับ, 5.25"-ฟลอปปี้)

ลิงค์ภายนอก

  • การเข้าถึงอาร์กิวเมนต์บรรทัดคำสั่ง (Microsoft.com)
ดึงมาจาก "https://en.wikipedia.org/w/index.php?title=Program_Segment_Prefix&oldid=1157425802"