1 / 61

Lecture 4

Lecture 4. Instruction Sets. ISA (Instruction Set Architecture). ISA หรือ Instruction Set Architecture คือส่วนเชื่อมต่อระหว่าง compiler และ hardware. Instruction Sets. องค์ประกอบสำคัญที่สุดของคำสั่งคอมพิวเตอร์ คือ Opcode ซึ่งกำหนดรายละเอียดการทำงานที่จะต้องทำ

Download Presentation

Lecture 4

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Lecture 4 Instruction Sets

  2. ISA (Instruction Set Architecture) • ISA หรือ Instruction Set Architecture คือส่วนเชื่อมต่อระหว่าง compiler และ hardware

  3. Instruction Sets • องค์ประกอบสำคัญที่สุดของคำสั่งคอมพิวเตอร์ คือ • Opcode ซึ่งกำหนดรายละเอียดการทำงานที่จะต้องทำ • ตัวถูกดำเนินการแสดงที่มา (source operand) • ตัวถูกดำเนินการแสดงที่เก็บ (destination operand) ซึ่งระบุแหล่งที่มาของข้อมูลและแหล่งที่เก็บข้อมูลผลลัพธ์ • การอ้างอิงคำสั่งต่อไป (Next instruction) • Opcode กำหนดงานที่จะต้องทำ ซึ่งเป็นส่วนหนึ่งส่วนใดของ การคำนวณทางคณิตศาสตร์และตรรกะ, การเคลื่อนย้ายข้อมูลระหว่างรีจิสเตอร์สองตัว หรือ ระหว่างรีจิสเตอร์กับหน่วยความจำ หรือระหว่างตำแหน่งในหน่วยความจำ, การทำงานไอโอ และ การควบคุม • การอ้างอิงตัวถูกดำเนินการ(operand) เป็นการกำหนดรีจิสเตอร์ หรือตำแหน่งหน่วยความจำที่เก็บข้อมูล ข้อมูลอาจจะเป็นตำแหน่งที่อยู่, ตัวเลข, ตัวอักษร หรือ ข้อมูลตรรกะ

  4. Instruction Sets • การอ้างอิงข้อมูลนั้นมักจะใช้ในลักษณะของ สแต็ก(stack) มีไว้ใช้จัดการการเรียกใช้ฟังก์ชันและการคืนค่าให้แก่ฟังก์ชันที่เรียกใช้ และอาจนำมาใช้ในการเก็บตำแหน่งที่อยู่ในหน่วยความจำได้ การทำงานพื้นฐานเกี่ยวกับสแต็กคือ PUSH และ POP • Processor อาจแบ่งได้เป็นแบบ Big-endian, Little-endian และ Bi-endian • Big-endian : วางไบต์ที่มีค่าสูงสุดไว้ที่ตำแหน่งที่อยู่น้อย • Little-endian : วางไบต์ที่มีค่าสูงสุดไว้ที่ตำแหน่งที่อยู่สูง • Bi-endian : สามารถเก็บข้อมูลได้ทั้งสองแบบ

  5. วงรอบคำสั่ง • วงรอบการทำงาน 1 คำสั่งเราเรียกว่า “วงรอบคำสั่ง”(instruction cycle) จะประกอบด้วยวงรอบการอ่านคำสั่งหรือ fetch cycle และ execute cycle โปรแกรมจะหยุดทำงานเมื่อทำถึงคำสั่งที่ให้หยุดทำงาน หรือเมื่อปิดเครื่อง หรือเมื่อเกิดข้อผิดพลาดกับเครื่องจนหยุดการทำงาน • ในการอ่านคำสั่ง โปรเซสเซอร์อาจจะอ่านจากหน่วยความจำโดยตรง แต่โดยทั่วไปแล้วโปรเซสเซอร์จะอ่านตำแหน่งที่เก็บคำสั่งต่อไปจากโปรแกรมเคาเตอร์ (Program counter) ตำแหน่งเหล่านี้จะอยู่บนหน่วยความจำแล้วเอ็กซิคิวต์ตามคำสั่งที่อ่านเข้ามา ซึ่ง program counter จะทำการเพิ่มค่าขึ้นเรื่อย ๆ ทำให้โปรเซสเซอร์ทำงานเรื่อยไป

  6. ไดอะแกรมของวงรอบคำสั่งไดอะแกรมของวงรอบคำสั่ง

  7. ไดอะแกรมของวงรอบคำสั่งไดอะแกรมของวงรอบคำสั่ง • Instruction Address Calculation(IAC): หาตำแหน่งที่เก็บคำสั่งต่อไปที่โปรเซสเซอร์ที่จะอ่านเข้ามา • Instruction Fetch(IF):อ่านคำสั่งจากตำแหน่งบนหน่วยความจำลงในโปรเซสเซอร์ • Instruction Operation Decoding(IOD): วิเคราะห์คำสั่งเพื่อพิจารณาประเภทของโอเปอร์เรชั่นที่จะกระทำ รวมทั้งโอเปอร์แรนด์ที่จะใช้ • Operand Address Calculation(OAC): หาตำแหน่งของโอเปอร์แรนด์ ถ้าโอเปอร์เรชันนั้นมีการอ้างถึง โอเปอร์แรนด์หรือที่มีอยู่ในหน่วยความจำผ่านทางอุปกรณ์อินพุต/เอาท์พุต • Operand Fetch(OF): อ่านโอเปอร์แรนด์จากหน่วยความจำหรืออ่านจากอุปกรณ์อินพุต/เอาท์พุต • DataOperation(DO): นำข้อมูลมากระทำตามโอเปอเรชันที่กำหนดในคำสั่ง • Operand Store(OS): เขียนผลลัพธ์ลงในหน่วยความจำหรือส่งออกไปทางอุปกรณ์อินพุต/เอาท์พุต

  8. ประเภทคำสั่ง • ลองพิจารณาคำสั่งภาษาชั้นสูง เช่น pascal, Fortran หรือ Basic X = X + Y • ลองสมมติค่าตัวแปร X และ Y เก็บอยู่ที่ตำแหน่ง 123 และ 456 ตามลำดับ โอเปอเรชันนี้จะทำ 3 คำสั่ง คือ 1. โหลดค่าจากหน่วยความจำตำแหน่ง 123 ลงรีจิสเตอร์ 2. บวกค่าจากหน่วยความตำแหน่ง 456 กับค่าในรีจิสเตอร์ 3. เก็บค่าจากรีจิสเตอร์ลงบนหน่วยความจำตำแหน่ง 123 จะเห็นว่าภาษาชั้นสูงจะใช้สัญลักษณ์ทางคณิตศาสตร์และใช้ตัวแปร ส่วนคำสั่งภาษาเครื่องจะใช้การถ่ายโอนข้อมูลระหว่างหน่วยความจำกับรีจิสเตอร์ • ดังนั้นเราสามารถแบ่งกลุ่มประเภทคำสั่งของภาษาเครื่องได้ ดังนี้ • Data processing : คำสั่งทางคณิตศาสตร์และตรรกะ • Data storage : คำสั่งจัดการหน่วยความจำ • Data movement : คำสั่งจัดการอินพุต/เอาท์พุต • Control : คำสั่งตรวจสอบเงื่อนไขและกระโดดไปทำงาน

  9. จำนวน Address • ถ้าเราต้องการจำนวนแอ็ดเดรสสูงสุดสำหรับ 2 แอ็ดเดรสเพื่ออ้างอิงโอเปอแรนด์ อีก 1 แอ็ดเดรสสำหรับเก็บค่าผลลัพธ์ และ 1 แอ็ดเดรสสำหรับเก็บค่าคำสั่งต่อไปที่จะอ่านเข้ามา จะเห็นว่าต้องใช้ถึง 4 แอ็ดเดรส (2 สำหรับโอเปอร์แรนด์และอีก 2 สำหรับเก็บผลลัพธ์และคำสั่งถัดไป) • แต่ในทางปฎิบัติคำสั่งที่ใช้โอเปอแรนด์ 4 แอ็ดเดรสหาได้ยาก ส่วนมากจะเป็นหนึ่ง หรือสอง หรือสามแอ็ดเดรสเท่านั้น ส่วนแอ็ดเดรสสำหรับคำสั่งต่อไปส่วนมากจะใช้ Program counter

  10. จำนวน Address Y = A x B + C x C LOAD A ย้าย A ไปยัง Accumalator AC MULTIPLY B AC := AC x B STORE T ย้าย AC ไปหน่วยความจำตำแหน่ง T LOAD C ย้าย C ไปยังแอ็กคิวมูเลเตอร์ AC MULTIPLY C AC := AC x C ADD T AC := AC + T STORE X เก็บค่าผลลัพธ์ในหน่วยความจำตำแหน่ง X One Address MOVE T, A T := A MULTIPLY T, B T := T x B MOVE X, C X := C MULTIPLY X, C X := X x C LOAD X, T X:= X + T Two Address

  11. จำนวน Address Y = A x B + C x C MULTIPLY T, A, B T := A x B MULTIPLY X, C, C X := C x C ADD X, X, T X := X + T Three Address PUSH A ย้าย A ไปอยู่บนสุดของสแต็ก PUSH B ย้าย B ไปอยู่บนสุดของสแต็ก MULTIPLY ลบ A, B ออกจากแสต็กและแทนค่าด้วย A x B PUSH C ย้าย C ไปอยู่บนสุดของสแต็ก PUSH C ย้ายก็อปปี้ที่สองของ C ไปอยู่บนสุดของสแต็ก MULTIPLY ลบ C, C ออกจากสแต็ก และแทนค่าด้วย C x C ADD ลบ C x C, A x B ออกจากสแต็ก และแทนค่าด้วย ผลบวกของ (C x C) + (A x B) POP X ย้ายผลลัพธ์จากบนสุดของสแต็กไปเก็บไว้ที่ X Zero Address Stack processor

  12. การออกแบบชุดคำสั่ง • การออกแบบชุดคำสั่งเป็นงานที่มีความซับซ้อนเนื่องจากมีผลกระทบกับระบบคอมพิวเตอร์ ชุดคำสั่งกำหนดฟังก์ชันที่หลากหลายที่ทำโดยซีพียู มีผลกระทบอย่างมากกับซีพียู ชุดคำสั่งคือสิ่งที่โปรแกรมเมอร์ใช้ควบคุมซีพียู ดังนั้นสิ่งที่โปรแกรมเมอร์ต้องการจะต้องนำมาพิจารณาในการออกแบบชุดคำสั่งด้วย พื้นฐานในการออกแบชุดคำสั่งควรมี ดังนี้ • Operation repertory: จำนวนโอเปอเรชันที่มีให้เลือกใช้ รวมทั้งความซับซ้อนของโอเปอเรชันที่ควรเป็น • Data type : ความหลากหลายของประเภทข้อมูลที่ทำโอเปอเรชัน • Instruction format : ความยาวของคำสั่ง(เป็นบิต)จำนวนแอ็ดเดรส ขนาดของฟิลด์และอื่น ๆ • Register: จำนวนรีจิสเตอร์ที่คำสั่งสามารถอ้างอิงและใช้ประโยชน์ได้ • Addressing : การกำหนดโหมดของแอ็ดเดรสสำหรับโอเปอแรนด์

  13. ประเภทของโอเปอเรชัน • จำนวน Opcode แต่ละเครื่องมีหลากหลายกันไป แต่อย่างไรก็ตาม ประเภทโอเปอเรชันพื้นฐานที่พบในแต่ละเครื่องจะเหมือนกัน ซึ่งสามารถแบ่งกลุ่มได้ ดังนี้ • โอเปอเรชันทางด้านการถ่ายโอนข้อมูล (Data transfer) • โอเปอเรชันทางด้านคณิตศาสตร์ (Arithmetic) • โอเปอเรชันทางด้านตรรกะ (Logical) • โอเปอเรชันทางด้านการแปลงค่า (Conversion) • โอเปอเรชันทางด้านอุปกรณ์อินพุต/เอาท์พุต (I/O) • โอเปอเรชันทางด้านการควบคุมระบบ (System control)

  14. ประเภทของโอเปอเรชัน

  15. ประเภทของโอเปอเรชัน

  16. ประเภทของโอเปอเรชัน

  17. ประเภทของโอเปอเรชัน

  18. ประเภทของโอเปอเรชัน

  19. ประเภทของโอเปอเรชัน

  20. โอเปอเรชันทางด้านการโอนถ่ายข้อมูลโอเปอเรชันทางด้านการโอนถ่ายข้อมูล • เป็นประเภทของคำสั่งที่เป็นพื้นฐานที่สุด ซึ่งจะต้องมีการกำหนด ดังนี้ • ตำแหน่งของโอเปอแรนด์ต้นทางกับโอเปอแรนด์ปลายทาง แต่ละตำแหน่งอาจจะเป็นหน่วยความจำรีจิสเตอร์ หรือส่วนบนสุดของ stack ก็ได้ • ขนาดความยาวของข้อมูลที่จะถ่ายโอนนั้นจะต้องกำหนดให้แน่นอน • กำหนดโหมดแอ็ดเดรส (Addressing mode) ของแต่ละโอเปอแรนด์ • ถ้าพิจารณาการทำงานของ CPU แล้ว การถ่ายโอนข้อมูลเป็นประเภทที่ธรรมดาที่สุด ถ้าทั้งต้นทางและปลายทางเป็นรีจิสเตอร์ ซีพียูก็แค่ย้ายข้อมูลจากรีจิสเตอร์หนึ่งไปรีจิสเตอร์อีกตัวหนึ่งเท่านั้น ซึ่งเป็นการทำงานภายในซีพียู แต่ถ้าโอเปอแรนด์ใดหรือทั้งสองโอเปอแรนด์อยู่ในหน่วยความจำแล้ว ซีพียูจะต้องกระทำสิ่งใดสิ่งหนึ่ง หรือทุกสิ่งดังต่อไปนี้ • คำนวณแอ็ดเดรสของหน่วยความจำตามการกำหนดโหมดของแอ็ดเดรส • ถ้าแอ็ดเดรสอ้างถึงหน่วยความจำเสมือน จะแปลจากแอ็ดเดรสเสมือนเป็นแอ็ดเดรสจริง • อาจกำหนดแอ็ดเดรสในแคช • ถ้าไม่กำหนด ให้ออกคำสั่งไปยังโมดูลของหน่วยความจำ

  21. โอเปอเรชันทางด้านตรรกะโอเปอเรชันทางด้านตรรกะ • โอเปอเรชัน arithmetic shift จะกระทำกับข้อมูลเหมือนจำนวนเต็มที่มีเครื่องหมาย และไม่เลื่อนบิตเครื่องหมาย สำหรับการเลื่อนทางขวาแบบนี้ จะทำสำเนาบิตเครื่องหมายไว้ที่บิตขวา แต่สำหรับการเลื่อนทางซ้ายจะเลื่อนบิตไปทางซ้ายเหมือน logical left shift แต่ไม่ต้องเลื่อนบิตเครื่องหมาย ให้คงบิตนั้นไว้ • Rotate หรือการหมุนซึ่งเป็นการเลื่อนแบบวนรอบเป็นโอเปอเรชันที่เก็บค่าทุกบิตไว้ โดยการหมุน ถ้าเป็นการหมุนขวา (Right Rotate) บิตขวาสุดจะหมุนไปเป็นบิตซ้ายสุด หรือถ้าเป็นการหมุนซ้าย (Left Rotate) บิตที่อยู่ซ้ายสุดจะหมุนไปเป็นบิตขวาสุด (ทั้งสองกรณีจะต้องมีการตรวจสอบเพื่อให้คงสภาพในกรณีที่บิตซ้ายสุดเป็นเป็นเครื่องหมาย (sign bit) ด้วย

  22. โอเปอเรชันทางตรรกะ • ตัวอย่างการเลื่อนและการหมุนบิต

  23. โอเปอเรชันการควบคุม • คำสั่งในกลุ่มต่าง ๆ ที่กล่าวมาแล้วเป็นคำสั่งที่มีการโหลดคำสั่งต่อไปไว้ในหน่วยความจำเรียบร้อยแล้ว คือคำสั่งจะเรียงลำดับคำสั่งก่อนหลังไว้แล้ว อย่างไรก็ตามยังมีกลุ่มคำสั่งที่เปลี่ยนลำดับการเอ็กซิคิวต์คำสั่ง ซีพียูจะทำคำสั่งในกลุ่มนี้โดยอัปเดท PC ที่ประกอบด้วยแอ็ดเดรสของคำสั่งในหน่วยความจำ ยกตัวอย่างเช่น คำสั่ง • branch • skip • procedure

  24. คำสั่ง branch • branch หรือบางครั้งเรียกว่า jump หลังคำสั่ง branch จะเป็นแอ็ดเดรสที่กำหนดให้กระโดดไปทำคำสั่งต่อไป ส่วนมากคำสั่งนี้จะเป็นคำสั่ง conditional branch ซึ่งจะมีการเปรียบเทียบเงื่อนไขก่อน ถ้าเกิดผลตามเงื่อนไขจึงกระโดดไปแอ็ดเดรสตามที่กำหนด (อัปเดท PC ให้เท่ากับแอ็ดเดรสที่กำหนดในโอเปอแรนด์) แต่ถ้าไม่ตรงเงื่อนไขก็จะเพิ่ม PC ตามปกติเพื่อเอ็กซิคิวต์คำสั่งถัดไป • มี 2 วิธี ในการสร้างเงื่อนไขเพื่อตรวจสอบคำสั่ง conditional branch • กำหนดรหัสขนาด 1 บิต หรือหลายบิตก็ได้เพื่อรองรับผลลัพธ์ที่เกิดขึ้น เช่นในบางเครื่องคำสั่งสำหรับ 4 กรณีอาจเป็น • BRP X กระโดดไปตำแหน่ง X ถ้าผลลัพธ์เป็นบวก • BRNX กระโดดไปตำแหน่ง X ถ้าผลลัพธ์เป็นลบ • BRZ X กระโดดไปตำแหน่ง X ถ้าผลลัพธ์เป็นศูนย์ • BRO X กระโดดไปตำแหน่ง X ถ้าผลลัพธ์เกิด overflow

  25. คำสั่ง branch • อีกวิธีคือรูปแบบที่กำหนดคำสั่งเป็น 3 แอ็ดเดรสเพื่อทำการเปรียบเทียบและกำหนดตำแหน่งที่กระโดดไปในคำสั่งเดียวกันเลย เช่น • BRE R1, R2, X กระโดดไปตำแหน่ง X เมื่อข้อมูลใน R1 เท่ากับข้อมูลใน R2 • รูปหน้าถัดไปแสดงตัวอย่างของคำสั่ง Branch ให้จำไว้ว่าการกระโดดสามารถกระโดดไปข้างหน้า(ไปคำสั่งแอ็ดเดรสสูงกว่า) หรือกระโดดย้อนกลับ(แอ็ดเดรสต่ำกว่า) ในตัวอย่างแสดงถึงการกระโดดโดยไม่มีเงื่อนไขและแบบมีเงื่อนไขที่สามารถเกิดการวนรอบคำสั่งได้ คำสั่งในตำแหน่ง 302 ถึง 310 จะถูกเอ็กซิคิวซ์ซ้ำ ๆ จนกว่าผลลัพธ์ของ X-Y เป็น 0

  26. คำสั่ง branch Memory Address Instruction 300 …. 301 …. 302 SUB X, Y 303 BRZ 311 ….. …. ….. …. ….. …. 310 BR 302 311 …. ….. …. 325 BRE R1, R2, 335 ….. …. ….. …. 335 …. Unconditional branch Conditional branch Conditional branch

  27. คำสั่ง skip • คำสั่งในกลุ่มการควบคุมอีกคำสั่งหนึ่งคือ skip ซึ่งคำสั่งนี้จะมีแอ็ดเดรสที่แน่นอน โดยปกติแล้วคำสั่ง skip จะบอกว่ามีหนึ่งคำสั่งที่ถูกข้ามไป ดังนั้นแอ็ดเดรสที่เห็นนี้จะเท่ากับแอ็ดเดรสของคำสั่งต่อไปบวกกับความยาวคำสั่ง เนื่องจากคำสั่ง skip ไม่ต้องการแอ็ดเดรสปลายทาง ตัวอย่างที่เห็นทั่วไปคือคำสั่ง increment-and-skip-if-zero(ISZ) ดังตัวอย่างด้านล่าง • 401 …….. • …. • ISZ R1 • BR 401 • 411 …….. ในตัวอย่างนี้มีการใช้คำสั่ง 2 คำสั่งที่ทำให้เกิดการวนรอบค่า R1 ถูกกำหนดให้มีค่าเป็นเลขลบ ตอนท้ายของการวนรอบค่า R1 ถูกเพิ่มค่า ถ้ายังไม่ใช่ 0 โปรแกรมจะกระโดดกลับไปที่จุดเริ่ม ต้นของการวนรอบ นอกนั้นคำสั่งกระโดดจะถูกข้ามไป และโปรแกรมยังคงทำคำสั่งต่อไปหลังจาก หมดการวนรอบ

  28. คำสั่ง procedure call • procedure คือส่วนย่อย ๆ ของโปรแกรมคอมพิวเตอร์ที่รวมอยู่ในโปรแกรมใหญ่ ประโยชน์ของ procedure คือ สามารถเรียกใช้ส่วนย่อยของโปรแกรมได้หลายครั้งโดยไม่ต้องเขียนใหม่ทำให้เกิดประสิทธิภาพสูงในการจัดเก็บข้อมูล และยังช่วยให้การเขียนโปรแกรมขนาดใหญ่ทำได้ง่ายโดยการแบ่งเป็นส่วนย่อย ๆ แล้วเขียนโปรแกรมให้เสร็จเรียบร้อยในแต่ละส่วน แล้วค่อยนำมารวมกันภายหลัง • กลไกการทำงานของ procedure จะมีคำสั่งพื้นฐาน 2 คำสั่ง คือ คำสั่ง call เพื่อกระโดดจากตำแหน่งปัจจุบันไปยัง procedure ที่ต้องการ และคำสั่ง return เพื่อกลับจาก procedure มายังตำแหน่งเดิมที่เรียก procedure

  29. คำสั่ง procedure call 5000 จากรูปแสดงการมี procedure ในโปรแกรมหลัก โดยโปรแกรมหลักอยู่ที่ตำแหน่ง 5000 ที่มีการเรียก Procedure ที่ชื่อ Proc1 ซึ่งเริ่มต้นที่ตำแหน่ง 5500 เมื่อถึงคำสั่ง call ที่เรียก Proc1 นั้น ซีพียูจะหยุดการเอ็กซิคิวซ์คำสั่งที่โปรแกรมหลัก แล้ว เริ่มต้นการเอ็กซิคิวซ์ Proc1 โดยดึงคำสั่งถัดไปจาก ตำแหน่ง 5500 ภายใน Proc1 จะมีคำสั่ง CALL 2 ครั้งเพื่อเรียก Proc2 ซึ่งเริ่มต้นที่ตำแหน่ง 5800 ในแต่ละกรณีจะหยุดการเอ็กซิคิวต์ Proc1 ไว้ก่อน แล้วจะเริ่มเอ็กซิคิวซ์ Proc2 ก่อนจนถึงคำสั่ง RETURN ทำให้ซีพียูกลับไปยังโปรแกรมที่เรียก procedure แล้วเอ็กซิคิวซ์คำสั่งที่อยู่ถัดจากคำสั่ง CALL ……………. …………….. CALL Proc1 ……………… Main Program 5100 5101 5500 ……………. …………….. CALL Proc2 ……………… CALL Proc2 …………….. RETURN Procedure Proc1 5600 5601 5650 5651 5800 ……………. …………… RETURN Procedure Proc2

  30. คำสั่ง procedure call • เนื่องจากสามารถเรียก procedure ได้จากหลายจุด ทำให้ซีพียูต้องมีวิธีการเก็บแอ็ดเดรสเพื่อกลับมายังตำแหน่งเดิมได้ การจะใช้สแต็ก (stack) ในการเรียงข้อมูล หรือไอเท็มเป็นชั้น ๆ โดยข้อมูลที่เข้ามาใหม่จะอยู่บนสุดและจะถูกนำไปใช้งานก่อนในลักษณะ Last-in-First-out(LIFO) เมื่อมีการเรียก procedure ซีพียูจะเก็บค่าแอ็ดเดรสลงบนแสต็ก หลังจากเอ็กซิคิวซ์คำสั่งใน procedure จนเสร็จเรียบร้อยจนเจอคำสั่ง return ซีพียูจะใช้แอ็ดเดรสบนสแต็ก การใช้สแต็กแสดงดังรูป แสต็ก เริ่มต้น หลังจาก CALL Proc1 เริ่มต้น CALL Proc2 หลังจาก RETURN หลังจาก CALL Proc2 หลังจาก RETURN หลังจาก RETURN

  31. คำสั่ง procedure call • นอกจากการเก็บค่าแอ็ดเดรสเพื่อกลับไปทำงานที่เดิมแล้ว การเรียก procedure จะต้องมีการผ่านค่าพารามิเตอร์เข้าไปด้วย วิธีการส่งผ่านพารามิเตอร์ที่ยืดหยุ่นที่สุดคือการใช้สแต็ก เมื่อโปรเซสเซอร์มีการเรียก procedure ไม่เพียงเก็บค่าแอ็ดเดรสเดิมแล้ว มันยังเก็บค่าพารามิเตอร์เพื่อส่งผ่านไปยัง procedure ที่ถูกเรียกแล้ว procedure นั้นยังสามารถใช้พารามิเตอร์จากสแต็กได้อีกด้วย นอกจากนั้นค่าพารามิเตอร์ที่ส่งกลับก็ยังเก็บบนสแต็กได้ด้วย ชุดของพารามิเตอร์ทั้งหมดที่รวมทั้งแอ็ดเดรสเดิม จะถูกเก็บสำหรับการอ้างอิงใน procedure ที่อ้างอิงถึงสแต็กเฟรม • ตัวอย่างการส่งผ่านค่าพารามิเตอร์จะเป็นดังรูปหน้าถัดไปซึ่งในตัวอย่างมี procedure ที่ชื่อ P และ Q ใน P มีการประกาศตัวแปร x1 และ x2 แบบโลคอล ส่วน Q ที่สามารถเรียกได้จาก P มีการประกาศตัวแปร y1 และ y2 แบบโลคอลเช่นเดียวกัน ในรูปนี้ ที่จุด return point ในแต่ละ procedure เป็นไอเท็มแรกที่ถูกเก็บในสแต็กเฟรมที่สัมพันธ์กัน ถัดไปจะเก็บพอยเตอร์ของจุดเริ่มต้นเฟรมเดิม ซึ่งเป็นสิ่งจำเป็นถ้าจำนวนหรือความยาวของพารามิเตอร์ที่เก็บบนสแต็กมีค่าไม่แน่นอน

  32. คำสั่ง procedure call Stack Frame เมื่อใช้ใน procedure P และ Q

  33. ประเภทข้อมูลของ Pentium • Pentium มีประเภทข้อมูลที่มีความยาว 8 บิต(byte),16 บิต(word),32 บิต(doubleword) และ 64 บิต(quadword) เพื่อให้เกิดความยืดหยุ่นสูงสุดในโครงสร้างข้อมูล และการจัดการหน่วยความจำที่มีประสิทธิภาพสูงสุดกำหนดให้ • word ต้องไม่วางบนแอ็ดเดรสที่เป็นเลขคู่ • Double word ต้องไม่วางบนแอ็ดเดรสที่หารด้วย 4 ลงตัว • Quadword ต้องไม่วางบนแอ็ดเดรสที่หารด้วย 8 ลงตัว ส่วนการเก็บข้อมูลในเครื่องที่เป็น Pentium จะใช้ little endian คือไบต์ที่มีค่าน้อยที่สุด จะเก็บบนแอ็ดเดรสต่ำสุด ทั้ง byte, word, double word, quadword เป็น ประเภทข้อมูลพื้นฐาน นอกจากนี้ Pentium ยังสนับสนุนประเภทข้อมูลแบบพิเศษที่ใช้คำสั่ง เฉพาะดังตารางหน้าถัดไป

  34. ประเภทข้อมูลของ Pentium

  35. การกำหนดแอ็ดเดรสหน่วยความจำการกำหนดแอ็ดเดรสหน่วยความจำ • สมมติว่ามีข้อมูลขนาด 32 บิตซึ่งมีค่าฐานสิบหกเป็น 89ABCDEF ถูกเก็บไว้ในหน่วยความจำ 1word ที่แอ็ดเดรส 1000 ในคอมพิวเตอร์ที่สามารถกำหนดข้อมูลในระดับไบต์ได้นั้น (byte addressable memory) ค่าของเลขจำนวนนี้เกิดจากข้อมูลขนาด 4 ไบต์ ซึ่งไบต์ที่มีค่านัยสำคัญต่ำสุด (LSB) จะเก็บค่า EF ส่วนไบต์ที่มีค่านัยสำคัญสูงสุด (MSB) จะเก็บค่า 89 ไว้ การเก็บข้อมูลชุดนี้ในหน่วยความจำทำได้ 2 วิธี คือ Little Endian และ Big Endian โดยที่ Little Endian จะวางไบต์ที่มีนัยสำคัญต่ำสุดไว้ที่แอ็ดเดรสต่ำสุด ส่วน Big Endian จะวางไบต์ที่มีค่านัยสำคัญสูงสุดไว้ที่แอ็ดเดรสต่ำสุด Little Endian Big Endian

  36. การกำหนดแอ็ดเดรสหน่วยความจำการกำหนดแอ็ดเดรสหน่วยความจำ • การวางข้อมูลแบบ Little Endian นี้ส่วนมากพบใน Intel 80x86, Pentium, VAX, Alpha • ส่วนการวางข้อมูลแบบ Big Endian จะพบใน IBM System 379/390, Motolora 680x, SUN SPARC • การใช้งานในคอมพิวเตอร์เครื่องเดียวกันไม่เกิดปัญหา แต่ถ้ามีการแลกเปลี่ยนข้อมูลระหว่างกัน ดังนั้นการแลกเปลี่ยนข้อมูลระหว่างเครื่องจำเป็นต้องทราบโครงสร้างข้อมูลที่ทำการแลกเปลี่ยนกันด้วย เช่น ถ้ามีข้อมูล “ARCHITECTURE” แต่การผิดพลาดในการวางไบต์ในหน่วยความจำ ข้อมูลที่อ่านได้ใหม่อาจจะเป็น “ERUTCETIHCRA” ก็ได้ • การแก้ปัญหาระหว่าง little และ bigendian ปัจจุบันซีพียู PowerPC ได้ออกแบบเพื่อสนับสนุนการเก็บข้อมูลได้ทั้งสองแบบ เรียกว่า Bi-endian ทำให้สามารถย้ายซอฟต์แวร์ให้ไปทำงานกับระบบคอมพิวเตอร์อื่นได้

  37. การกำหนดโหมดของแอ็ดเดรสการกำหนดโหมดของแอ็ดเดรส • การกำหนดแอ็ดเดรสแบบให้ค่าโดยตรง(Immediate Addressing) • การกำหนดแอ็ดเดรสโดยตรง(Direct Addressing) • การกำหนดแอ็ดเดรสทางอ้อม(Indirect Address) • การกำหนดแอ็ดเดรสผ่านรีจิสเตอร์โดยตรง(Register Direct Addressing) • การกำหนดแอ็ดเดรสผ่านรีจิสเตอร์ทางอ้อม(Register Indirect Addressing) • การกำหนดแอ็ดเดรสแบบแทนที่(Displacement หรือ Indexed Addressing) • การกำหนดแอ็ดเดรสแบบสัมพันธ์ (Relative Addressing) • การใช้สแต็ก (Stack)

  38. การกำหนดแอ็ดเดรสแบบให้ค่าโดยตรง(Immediate Addressing) • การกำหนดแบบนี้จะเป็นรูปแบบที่ง่ายที่สุด และใช้งานบ่อยครั้ง เนื่องจากเป็นการกำหนดหรือให้ค่าคงที่ หรือเป็นการกำหนดค่าเริ่มต้นให้กับค่าตัวแปร รูปแบบคำสั่งจะเป็น LOAD X, #1000 เป็นการโหลดข้อมูล 1000 ไว้ที่ตัวแปร X • ข้อดีของวิธีนี้คือไม่มีการอ้างอิงหน่วยความจำ (นอกเหนือจากการอ่านคำสั่งเข้ามาในซีพียู) ทำให้ประหยัดเวลาในการทำงาน ส่วนข้อเสียของวิธีนี้คือขนาดของตัวเลขจะถูกจำกัดด้วยขนาดของฟิลด์ของแอ็ดเดรส Op Operand

  39. การกำหนดแอ็ดเดรสโดยตรง(Direct Addressing) • อาจเรียกอีกอย่างหนึ่งว่า การกำหนดแอ็ดเดรสหน่วยความจำโดยตรง (Memory Direct Addressing) เป็นการอ้างอิงตำแหน่งหน่วยความจำโดยตรง เมื่อได้ตำแหน่งแล้วจึงนำค่าจากตำแหน่งนั้นมาใช้งาน การกำหนดแอ็ดเดรสแบบนี้นิยมใช้ในระบบคอมพิวเตอร์ในยุคแรก ๆ แต่ในปัจจุบันไม่ค่อยนิยม การประมวลผลจะต้องใช้วงรอบการอ้างอิงหน่วยความจำเพิ่มอีก 1 รอบ แต่ไม่มีการคำนวณ ข้อเสียก็คือข้อจำกัดในการอ้างอิงหน่วยความจำ รูปแบบคำสั่งจะเป็น LOAD X, 1000เป็นการโหลดข้อมูลที่แอ็ดเดรส 1000 ไว้ที่ตัว แปร X (ถ้าที่แอ็ดเดรส 1000 มีค่า 10 ดังนั้น X จะมีค่าเท่ากับ 10) คำสั่ง หน่วยความจำ Op Operand 1002 1001 10 1000 999

  40. การกำหนดแอ็ดเดรสทางอ้อม(Indirect Addressing) • เรียกอีกอย่างหนึ่งว่าการกำหนดแอ็ดเดรสหน่วยความจำทางอ้อม (Memory Indirect Address) ลักษณะนี้จะคล้ายกับการกำหนดแอ็ดเดรสโดยตรง แต่การกำหนดแอ็ดเดรสแบบนี้ค่าที่ปรากฎในคำสั่งไม่ใช่แอ็ดเดรสของข้อมูล แต่เป็นแอ็ดเดรสของแอ็ดเดรสของข้อมูล การกำหนดเช่นนี้เนื่องจากฟิลด์ของแอ็ดเดรสมีขนาดสั้นกว่าความยาวของ 1word ทำให้ขอบเขตของแอ็ดเดรสถูกจำกัด รูปแบบจะเป็น LOAD X,(1000)เป็นการโหลดข้อมูลที่อยู่บนแอ็ดเดรสที่เก็บอยู่ในแอ็ด เดรส 1000 (ถ้าที่แอ็ดเดรส 1000 มีค่า 1002 ดังนั้นข้อมูลที่แท้จริงอยู่ที่แอ็ดเดรส 1002 ซึ่งมีค่า 20 ดังนั้น X จะมีค่าเท่ากับ 20) คำสั่ง หน่วยความจำ Op Operand 20 1002 1001 1002 1000 999

  41. การกำหนดแอ็ดเดรสผ่านรีจิสเตอร์โดยตรง(Register Direct Addressing) • การกำหนดแบบนี้จะคล้ายกับการกำหนดแอ็ดเดรสโดยตรง สิ่งที่ต่างกันคือฟิลด์ของแอ็ดเดรสในคำสั่งจะเก็บค่าหมายเลขรีจิสเตอร์ไว้ แทนการกำหนดแอ็ดเดรสของหน่วยความจำ โดยปกติฟิลด์ของแอ็ดเดรสที่กำหนดหมายเลขรีจิสเตอร์จะมีขนาด 3-5 บิตทำให้สามารถกำหนดหมายเลขรีจิสเตอร์ได้ 8-32 ตัว LOAD X, R1 เป็นการโหลดข้อมูลจากรีจิสเตอร์ R1 ไว้ที่ ตัวแปร X (ถ้าที่รีจิสเตอร์ R1 มีค่า 30ดังนั้น X จะมีค่าเท่ากับ 30) คำสั่ง Op R1 … รีจิสเตอร์ R1 30

  42. การกำหนดแอ็ดเดรสผ่านรีจิสเตอร์ทางอ้อม(Register Indirect Addressing) • การกำหนดแอ็ดเดรสผ่านรีจิสเตอร์ทางอ้อมจะเปรียบได้กับการกำหนดแอ็ดเดรสทางอ้อม ความแตกต่างอยู่ที่ฟิลด์ของแอ็ดเดรสในคำสั่งจะเก็บแอ็ดเดรสในหน่วยความจำ หรือเก็บหมายเลขรีจิสเตอร์ LOAD x, (R1) เป็นการโหลดข้อมูลที่อยู่ในแอ็ดเดรสที่เก็บอยู่ในรีจิส เตอร์ R1 ไว้ที่ตัวแปร X (ถ้าที่รีจิสเตอร์ R1 เก็บ ค่า 1001 และที่แอ็ดเดรส 1001ของหน่วยความ จำมีค่า 40 ดังนั้น X จะมีค่าเท่ากับ 40) คำสั่ง หน่วยความจำ Op R1 … 20 1002 40 1001 รีจิสเตอร์ R1 1002 1000 1001 999

  43. การกำหนดแอ็ดเดรสแบบแทนที่(Displacement หรือ Indexed Addressing) • การกำหนดแบบแทนที่นี้นำข้อดีของการกำหนดแอ็ดเดรสโดยตรงกับการกำหนดแอ็ดเดรสผ่านรีจิสเตอร์ทางอ้อมมาประยุกต์ใช้ การกำหนดแบบนี้จะใช้ฟิลด์ของแอ็ดเดรส 2 ฟิลด์ โดยจะต้องมีอย่างน้อย 1 ฟิลด์ ที่กำหนดค่าโดยตรง(กำหนดเป็นค่าคงที่) ส่วนอีกฟิลด์จะกำหนดโดยตรงหรือโดยทางอ้อมก็ได้ ซึ่งถ้าเป็นการกำหนดโดยทางอ้อมจะอ้างอิงรีจิสเตอร์ แล้วนำค่าในรีจิสเตอร์ไปบวกกับค่าคงที่ แล้วจะได้ค่าแอ็ดเดรสที่แท้จริง ซึ่งค่าแอ็ดเดรสที่แท้จริงนี้เป็นแอ็ดเดรสในหน่วยความจำ ดังนั้นค่าที่อยู่แอ็ดเดรสดังกล่าวจึงเป็นค่าที่นำมาใช้งาน LOAD X, (R1)+Constant เป็นการโหลดข้อมูลจากแอ็ดเดรสบน หน่วยความจำที่เกิดจากค่าในรีจิสเตอร์ บวกกับค่าคงที่ไว้ที่ตัวแปร X (ถ้าในรีจิส เตอร์มีค่า 1000, ค่าคงที่เท่ากับ 2 และ ที่แอ็ดเดรส 1002 มีค่าเท่ากับ 20 ดัง นั้นค่า X จะเท่ากับ 20)

  44. การกำหนดแอ็ดเดรสแบบแทนที่(Displacement หรือ Indexed Addressing) คำสั่ง หน่วยความจำ Op R1 2 20 1002 40 1001 1002 1000 + รีจิสเตอร์ R1 999 1000

  45. การกำหนดแอ็ดเดรสแบบสัมพันธ์(Relative Addressing) • การกำหนดแบบนี้คล้ายกับการกำหนดแอ็ดเดรสแบบแทนที่ เพียงแต่ว่าแทนที่จะใช้การอ้างอิงกับรีจิสเตอร์ การกำหนดแอ็ดเดรสแบบนี้จะอ้างอิงกับ Program counter ดังนั้นค่าคงที่จะบวกกับค่าใน Program counter แล้วได้ค่าแอ็ดเดรสที่แท้จริง ซึ่งค่าแอ็ดเดรสที่แท้จริงนี้เป็นแอ็ดเดรสในหน่วยความจำ ดังนั้นค่าที่อยู่ในแอ็ดเดรสดังกล่าวจึงเป็นค่าที่นำมาใช้งาน LOAD X, PC+Constantเป็นการโหลดข้อมูลจากแอ็ดเดรสบนหน่วย ความจำที่เกิดจากค่าใน PC บวกกับค่าคงที่ ไว้ที่ตัวแปร X (ถ้าใน PC มีค่า 1000,ค่าคงที่เท่ากับ 1 และค่าที่แอ็ดเดรส 1001มีค่าเท่ากับ 40 ดังนั้นค่า X จะเท่ากับ 40)

  46. การกำหนดแอ็ดเดรสแบบสัมพันธ์(Relative Addressing) คำสั่ง หน่วยความจำ Op 1 20 1002 40 1001 1002 1000 + PC 999 1000

  47. การใช้แสต็ก (Stack) • เนื่องจากสแต็กเป็นอาร์เรย์ของแอ็ดเดรสที่วางซ้อนกันอยู่ การนำแอ็ดเดรสมาใช้จะนำแอ็ดเดรสที่อยู่บนสุดออกมาใช้ก่อน เรียกว่า LIFO สแต็กนี้เป็นหน่วยความจำที่สงวนไว้ใช้งานโดยเฉพาะ สแต็กจะมีข้อมูลเสมอ และจะทำงานร่วมกับพอยเตอร์(pointer) • การนำข้อมูลไปใช้จะนำจากตำแหน่งที่พอยเตอร์ชี้เสมอ และปกติพอยเตอร์จะชี้ที่ตำแหน่งบนสุดนั่นเอง ข้อมูลบนสุดสองตัวของสแต็ก จะถูกเก็บในรีจิสเตอร์ภายในซีพียูเสมอ พอยเตอร์ของสแต็กก็เก็บอยู่ในรีจิสเตอร์เช่นกัน • ดังนั้นการกำหนดแอ็ดเดรสโดยใช้สแต็กนี้จะคล้ายกับการกำหนดแอ็ดเดรสผ่านรีจิสเตอร์โดยอ้อมนั่นเอง การกำหนดแอ็ดเดรสแบบนี้เป็นการอ้างอิงแอ็ดเดรสโดยอ้อม ไม่จำเป็นต้องอ้างอิงหน่วยความจำ แต่ใช้ข้อมูลตัวบนของสแต็กแทน

  48. การใช้แสต็ก (Stack) LOAD X, Stack เป็นการโหลดข้อมูลที่อยู่บนสุดของสแต็กไว้ที่ตัวแปรX (ถ้าข้อมูลที่อยู่บนสุดของสแต็กมีค่า 1000 ค่าX จะมีค่าเท่ากับ 1000 นั่นเอง) คำสั่ง Op รีจิสเตอร์ที่เก็บสแต็ก 1000 ส่วนบนของสแต็ก 520 730 1002

  49. การใช้ Stack ในการแปลง infix เป็น postfix • ตรวจข้อมูลตัวต่อไปที่ถูกอ่านเข้ามา • ถ้าเป็นตัวถูกกระทำ (operand) ให้ส่งออกเป็นผลลัพธ์ • ถ้าเป็นเครื่องหมายวงเล็บเปิด ให้ใส่ลงไปในสแต็ก • ถ้าเป็นตัวกระทำ (operator) ให้ทำดังนี้ • ถ้าตัวกระทำตัวบนสุดในสแต็กเป็นเครื่องหมายวงเล็บเปิด ให้ใส่ตัวกระทำนั้นลงไปในสแต็ก • ถ้าตัวกระทำมีค่า precedence สูงกว่าตัวบนสุดในสแต็ก ให้ใส่ตัวกระทำนั้นลงไปในสแต็ก • มิฉะนั้นให้อ่านตัวกระทำออกมาจากสแต็ก และส่งออกไปเป็นผลลัพธ์ตัวต่อไป และทำซ้ำในขั้นตอนที่ 4 • ถ้าเป็นเครื่องหมายวงเล็บปิด ให้อ่านตัวกระทำออกมาจากสแต็ก และส่งออกไปเป็นผลลัพธ์ตัวต่อไปจนกว่าจะพบเครื่องหมายวงเล็บเปิด ให้ทิ้งเครื่องหมายนั้นทิ้งไปและอ่านตัวต่อไปเข้ามา • ถ้ายังมีตัวต่อไปให้กลับไปทำขั้นตอนที่ 1 • ถ้าไม่มีตัวต่อไปแล้ว ให้อ่านตัวกระทำออกมาจากสแต็ก และส่งออกไปเป็นผลลัพธ์ตัวต่อไปจนหมดสแต็ก

  50. การใช้ Stack ในการแปลง infix เป็น postfix Input outputstack(top on right) A + B x C + (D + E) x F empty empty + B x C + (D + E) x F A empty B x C + (D + E) x F A + x C + (D + E) x F A B + C + (D + E) x F A B + x + (D + E) x F A B C + x (D + E) x F A B C x + + D + E) x F A B C x + + ( + E) x F A B C x + D + ( E) x F A B C x + D + ( + ) x F A B C x + D E + ( + x F A B C x + D E + + F A B C x + D E + + x empty A B C x + D E + F + x empty A B C x + D E + F x + empty

More Related