การออกกำลังกาย. โภชนาการ. อาหาร ออกกำลังกาย. กีฬา

ชื่อของการดำเนินการโดยไม่มีเงื่อนไขของคำสั่งคืออะไร พื้นฐานการเขียนโปรแกรมอุปกรณ์ MP (บรรยาย). คำสั่ง CMP และ TEST

นอกจากวิธีการคำนวณทางคณิตศาสตร์แล้ว ระบบคำสั่งไมโครโปรเซสเซอร์ยังมีวิธีการแปลงข้อมูลเชิงตรรกะอีกด้วย โดยวิธีการทางตรรกะการแปลงข้อมูลดังกล่าวซึ่งขึ้นอยู่กับ กฎของตรรกะที่เป็นทางการ

ตรรกะที่เป็นทางการทำงานในระดับของข้อความจริงและข้อความเท็จ สำหรับไมโครโปรเซสเซอร์ โดยปกติจะหมายถึง 1 และ 0 ตามลำดับ สำหรับคอมพิวเตอร์ ภาษาของเลขศูนย์และภาษาเป็นภาษาดั้งเดิม แต่หน่วยข้อมูลขั้นต่ำที่คำสั่งเครื่องทำงานคือไบต์ อย่างไรก็ตาม ที่ระดับระบบ มักจะจำเป็นต้องสามารถทำงานในระดับบิตที่ต่ำที่สุดเท่าที่จะเป็นไปได้

ข้าว. 29. วิธีการประมวลผลข้อมูลเชิงตรรกะ


วิธีการแปลงข้อมูลเชิงตรรกะรวมถึงคำสั่งเชิงตรรกะและการดำเนินการเชิงตรรกะ ตัวถูกดำเนินการของคำสั่งแอสเซมเบลอร์สามารถเป็นนิพจน์ได้ ซึ่งจะเป็นการผสมระหว่างตัวดำเนินการและตัวถูกดำเนินการ ในบรรดาตัวดำเนินการเหล่านี้อาจมีตัวดำเนินการที่ใช้การดำเนินการทางตรรกะกับวัตถุนิพจน์

ก่อนที่จะพิจารณาเครื่องมือเหล่านี้โดยละเอียด เรามาพิจารณาว่าข้อมูลโลจิคัลคืออะไรและดำเนินการกับเครื่องมือเหล่านี้อย่างไร

ข้อมูลบูลีน

พื้นฐานทางทฤษฎีสำหรับการประมวลผลข้อมูลเชิงตรรกะคือ ตรรกะที่เป็นทางการตรรกะมีหลายระบบ หนึ่งในที่มีชื่อเสียงที่สุดคือ แคลคูลัสประพจน์ข้อเสนอคือข้อความใด ๆ ที่สามารถพูดได้ จริง,หรือ เท็จ.

แคลคูลัสเชิงประพจน์คือชุดของกฎที่ใช้ในการพิจารณาความจริงหรือความเท็จของประพจน์ที่รวมกัน

แคลคูลัสเชิงประพจน์ผสมผสานอย่างกลมกลืนกับหลักการของคอมพิวเตอร์และวิธีการพื้นฐานของการเขียนโปรแกรม ส่วนประกอบฮาร์ดแวร์ทั้งหมดของคอมพิวเตอร์สร้างขึ้นจากชิปลอจิก ระบบการแสดงข้อมูลในคอมพิวเตอร์ในระดับต่ำสุดนั้นขึ้นอยู่กับแนวคิดของบิต เล็กน้อย มีเพียงสองสถานะ (0 (เท็จ) และ 1 (จริง)) เข้ากับแคลคูลัสเชิงประพจน์ได้อย่างเป็นธรรมชาติ

ตามทฤษฎี การดำเนินการเชิงตรรกะต่อไปนี้สามารถดำเนินการกับข้อความสั่ง (บนบิต)


1. การปฏิเสธ (ตรรกะ ไม่) -การดำเนินการเชิงตรรกะบนตัวถูกดำเนินการหนึ่งตัวที่ส่งผลให้เกิดส่วนกลับของค่าของตัวถูกดำเนินการดั้งเดิม

การดำเนินการนี้มีลักษณะเฉพาะตัวโดยตารางความจริงต่อไปนี้ (ตารางที่ 12)

ตารางที่ 12 ตารางความจริงสำหรับการปฏิเสธเชิงตรรกะ

2. การเพิ่มตรรกะ (รวมตรรกะ หรือ) -การดำเนินการเชิงตรรกะบนตัวถูกดำเนินการสองตัวซึ่งให้ผลลัพธ์เป็นจริง (1) ถ้าตัวถูกดำเนินการหนึ่งตัวหรือทั้งสองตัวเป็นจริง (1) และเป็นเท็จ (0) ถ้าตัวถูกดำเนินการทั้งสองตัวเป็นเท็จ (0)

การดำเนินการนี้อธิบายโดยใช้ตารางความจริงต่อไปนี้ (ตารางที่ 13)

ตารางที่ 13. ตารางความจริงสำหรับการรวมตรรกะ OR

3. การคูณเชิงตรรกะ (ตรรกะ และ) -การดำเนินการเชิงตรรกะบนตัวถูกดำเนินการสองตัวที่ประเมินค่าเป็นจริง (1) ก็ต่อเมื่อตัวถูกดำเนินการทั้งสองประเมินค่าเป็นจริง (1) ในกรณีอื่นๆ ทั้งหมด ค่าของการดำเนินการจะเป็น "เท็จ" (0)

การดำเนินการนี้อธิบายโดยใช้ตารางความจริงต่อไปนี้ (ตารางที่ 14)

ตารางที่ 14. ตารางลอจิกและความจริง

4. การเพิ่มพิเศษแบบลอจิคัล (แบบเอกสิทธิ์เฉพาะทางแบบลอจิคัล หรือ) -การดำเนินการเชิงตรรกะบนตัวถูกดำเนินการสองตัวที่ส่งผลให้เป็นจริง (1) ถ้าตัวถูกดำเนินการหนึ่งในสองตัวนั้นเป็นจริง (1) และเป็นเท็จ (0) ถ้าตัวถูกดำเนินการทั้งสองตัวเป็นเท็จ (0) หรือ "ความจริง" (1) การดำเนินการนี้อธิบายโดยใช้ตารางความจริงต่อไปนี้ (ตารางที่ 15)

ตารางที่ 15. ตารางความจริงสำหรับ XOR แบบลอจิคัล

ชุดคำสั่งไมโครโปรเซสเซอร์มีห้าคำสั่งที่สนับสนุนการทำงานเหล่านี้ คำแนะนำเหล่านี้ดำเนินการทางตรรกะกับบิตของตัวถูกดำเนินการ แน่นอนว่ามิติของตัวถูกดำเนินการจะต้องเหมือนกัน ตัวอย่างเช่น ถ้ามิติของตัวถูกดำเนินการเท่ากับ word (16 บิต) การดำเนินการทางตรรกะจะดำเนินการก่อนบนบิตศูนย์ของตัวถูกดำเนินการ และผลลัพธ์จะถูกเขียนแทนที่บิต 0 ของผลลัพธ์ ถัดไป คำสั่งจะทำซ้ำการกระทำเหล่านี้ตามลำดับในทุกบิตตั้งแต่หนึ่งถึงสิบห้า

คำสั่งลอจิก

ระบบคำสั่งไมโครโปรเซสเซอร์มีชุดคำสั่งที่รองรับการทำงานกับข้อมูลเชิงตรรกะดังต่อไปนี้:

1) และตัวถูกดำเนินการ _1, ตัวถูกดำเนินการ _2 เป็นการดำเนินการคูณทางตรรกะ คำสั่งดำเนินการทางตรรกะและการดำเนินการระดับบิต (ส่วนร่วม) บนบิตของตัวถูกดำเนินการoperand_1และตัวถูกดำเนินการ_2 ผลลัพธ์ถูกเขียนแทนตัวถูกดำเนินการ_1;

2) og ตัวถูกดำเนินการ_1, ตัวถูกดำเนินการ_2 - การดำเนินการของการเพิ่มตรรกะ คำสั่งดำเนินการ OR แบบลอจิคัลระดับบิต (disjunction) บนบิตของตัวถูกดำเนินการoperand_1และoperand_2 ผลลัพธ์ถูกเขียนแทนตัวถูกดำเนินการ_1;

3) xor ตัวถูกดำเนินการ_1, ตัวถูกดำเนินการ_2 - การดำเนินการของการเพิ่มพิเศษแบบลอจิคัล คำสั่งดำเนินการ XOR แบบลอจิคัลระดับบิตบนบิตของตัวถูกดำเนินการoperand_1และoperand_2 ผลลัพธ์จะถูกเขียนแทนตัวถูกดำเนินการ

4) ทดสอบตัวดำเนินการ_1, ตัวถูกดำเนินการ_2 - การดำเนินการ "ตรวจสอบ" (โดยวิธีการคูณเชิงตรรกะ) คำสั่งดำเนินการทางตรรกะและการดำเนินการระดับบิตบนบิตของตัวถูกดำเนินการoperand_1และตัวถูกดำเนินการ_2 สถานะของตัวถูกดำเนินการยังคงเหมือนเดิม มีเพียงแฟล็ก zf, sf และ pf เท่านั้นที่เปลี่ยนแปลง ซึ่งทำให้สามารถวิเคราะห์สถานะของแต่ละบิตของตัวถูกดำเนินการได้โดยไม่ต้องเปลี่ยนสถานะ

5) ไม่ใช่ตัวถูกดำเนินการเป็นการดำเนินการปฏิเสธเชิงตรรกะ คำสั่งทำการผกผันระดับบิต (แทนที่ค่าด้วยค่าตรงข้าม) ของแต่ละบิตของตัวถูกดำเนินการ ผลลัพธ์จะถูกเขียนแทนตัวถูกดำเนินการ

เพื่อให้เข้าใจถึงบทบาทของคำสั่งตรรกะในชุดคำสั่งไมโครโปรเซสเซอร์ สิ่งสำคัญคือต้องเข้าใจขอบเขตของแอปพลิเคชันและวิธีการทั่วไปในการใช้งานในการเขียนโปรแกรม

ด้วยความช่วยเหลือของคำสั่งตรรกะเป็นไปได้ การเลือกแต่ละบิตในตัวถูกดำเนินการเพื่อ การตั้งค่า การรีเซ็ต การกลับด้าน หรือเพียงแค่ตรวจสอบค่าเฉพาะ

ในการจัดระเบียบงานดังกล่าวด้วยบิต ตัวดำเนินการ _2 มักจะทำหน้าที่เป็นหน้ากาก ด้วยความช่วยเหลือของบิตของมาสก์นี้ที่ตั้งค่าในบิต 1 จะมีการกำหนดบิตตัวถูกดำเนินการ_1 ที่จำเป็นสำหรับการดำเนินการเฉพาะ เรามาแสดงคำสั่งเชิงตรรกะที่สามารถใช้เพื่อการนี้:

1) เพื่อตั้งค่าตัวเลข (บิต) เป็น 1 ใช้คำสั่ง og ตัวดำเนินการ_1, ตัวถูกดำเนินการ_2

ในคำสั่งนี้ โอเปอแรนด์_2 ซึ่งทำหน้าที่เป็นมาสก์ ต้องมี 1 บิตแทนที่บิตที่ต้องตั้งค่าเป็น 1 ในโอเปอเรเตอร์_1

2) เพื่อรีเซ็ตตัวเลข (บิต) เป็น 0 จะใช้คำสั่งและตัวถูกดำเนินการ _1, ตัวถูกดำเนินการ _2

ในคำสั่งนี้ โอเปอแรนด์_2 ซึ่งทำหน้าที่เป็นมาสก์ ต้องมีศูนย์บิตแทนที่บิตที่ต้องตั้งค่าเป็น 0 ในโอเปอเรเตอร์_1

3) คำสั่ง xor ตัวถูกดำเนินการ_1, ตัวถูกดำเนินการ_2 ถูกนำไปใช้:

ก) เพื่อหาว่าบิตใดในตัวถูกดำเนินการ_1 และตัวถูกดำเนินการแตกต่างกัน

b) เพื่อกลับสถานะของบิตที่ระบุในตัวดำเนินการ_1

บิตมาสก์ที่เราสนใจ (operand_2) เมื่อดำเนินการคำสั่ง xorg ต้องเป็นค่าเดียว ส่วนที่เหลือต้องเป็นศูนย์

คำสั่ง testoperand_1,operand_2 (ตรวจสอบตัวดำเนินการ_1) ใช้เพื่อตรวจสอบสถานะของบิตที่ระบุ

บิตที่ถูกตรวจสอบของoperand_1ในมาสก์ (operand_2) จะต้องตั้งค่าเป็นหนึ่ง อัลกอริทึมของคำสั่งทดสอบคล้ายกับอัลกอริทึมของคำสั่ง and แต่จะไม่เปลี่ยนค่าของoperand_1 ผลลัพธ์ของคำสั่งคือการตั้งค่าของแฟล็กศูนย์ zf:

1) ถ้า zf = 0 ดังนั้นผลลัพธ์ของการคูณเชิงตรรกะจะได้ผลลัพธ์เป็นศูนย์เช่น มาสก์หนึ่งบิตของหน่วยซึ่งไม่ตรงกับบิตหน่วยที่สอดคล้องกันของตัวถูกดำเนินการ

2) ถ้า zf = 1 ดังนั้นผลลัพธ์ของการคูณเชิงตรรกะจะได้ผลลัพธ์ที่ไม่เป็นศูนย์เช่น อย่างน้อยหนึ่งมาสก์ 1 บิตจับคู่กับตัวดำเนินการ 1 บิตที่สอดคล้องกัน

ในการตอบสนองต่อผลลัพธ์ของคำสั่งทดสอบ ขอแนะนำให้ใช้คำสั่ง Jump ป้ายกำกับ jnz (กระโดดหากไม่ใช่ศูนย์) - ข้ามหากค่าสถานะศูนย์ zf ไม่ใช่ศูนย์หรือคำสั่งที่มีการดำเนินการตรงกันข้าม - ป้ายกำกับ jz (กระโดด ถ้าศูนย์) - กระโดดถ้าศูนย์ตั้งค่าสถานะ zf = 0

คำสั่งสองคำสั่งต่อไปนี้ค้นหาบิตตัวดำเนินการแรกที่ตั้งค่าเป็น 1 การค้นหาสามารถทำได้ทั้งจากจุดเริ่มต้นและจุดสิ้นสุดของตัวถูกดำเนินการ:

1) bsfoperand_1,operand_2 (การสแกนบิตไปข้างหน้า) – การสแกนบิตไปข้างหน้า คำสั่งค้นหา (สแกน) บิตของoperand_2 จากค่านัยสำคัญน้อยที่สุดไปยังค่าที่สำคัญที่สุด (จากบิต 0 ถึงบิตที่มีนัยสำคัญสูงสุด) ในการค้นหาบิตแรกที่ตั้งค่าเป็น 1 หากพบหนึ่งค่า ตัวดำเนินการ_1 จะถูกเติมด้วยจำนวนของ บิตนี้เป็นค่าจำนวนเต็ม หากบิตทั้งหมดของoperand_2 เป็น 0 แฟล็กศูนย์ zf จะถูกตั้งค่าเป็น 1 มิฉะนั้น แฟล็ก zf จะถูกรีเซ็ตเป็น 0

2) bsroperand_1,operand_2 (รีเซ็ตการสแกนบิต) – สแกนบิตในลำดับย้อนกลับ คำสั่งจะค้นหา (สแกน) บิตของoperand_2 จากบิตที่มีนัยสำคัญมากที่สุดไปยังบิตที่มีนัยสำคัญน้อยที่สุด (จากบิตที่มีนัยสำคัญมากที่สุดไปยังบิต 0) ในการค้นหาบิตแรกที่ตั้งค่าเป็น 1 หากพบหนึ่งตัวoperand_1 จะถูกเติมด้วยจำนวนของ บิตนี้เป็นค่าจำนวนเต็ม สิ่งสำคัญคือตำแหน่งของบิตหน่วยแรกทางด้านซ้ายยังคงถูกนับเทียบกับบิต 0 หากบิตทั้งหมดของoperand_2 เป็น 0 ดังนั้นการตั้งค่าสถานะศูนย์ zf จะถูกตั้งค่าเป็น 1 มิฉะนั้นการตั้งค่าสถานะ zf จะถูกรีเซ็ตเป็น 0

ในไมโครโปรเซสเซอร์รุ่นล่าสุดของ Intel มีคำแนะนำเพิ่มเติมสองสามรายการในกลุ่มคำสั่งเชิงตรรกะที่อนุญาตให้คุณเข้าถึงบิตเฉพาะของตัวถูกดำเนินการ ตัวถูกดำเนินการสามารถอยู่ในหน่วยความจำหรือในการลงทะเบียนทั่วไป ตำแหน่งบิตถูกกำหนดโดยการชดเชยบิตเมื่อเทียบกับบิตที่มีนัยสำคัญน้อยที่สุดของตัวถูกดำเนินการ ค่าออฟเซ็ตสามารถระบุเป็นค่าโดยตรงหรือมีอยู่ในการลงทะเบียนวัตถุประสงค์ทั่วไป คุณสามารถใช้ผลลัพธ์ของคำสั่ง bsr และ bsf เป็นค่าออฟเซ็ต คำแนะนำทั้งหมดกำหนดค่าของบิตที่เลือกให้กับแฟล็ก CE

1) bt ตัวถูกดำเนินการ bit_offset (ทดสอบบิต) - ทดสอบบิต คำสั่งถ่ายโอนค่าบิตไปยังแฟล็ก cf

2) ตัวดำเนินการ bts, bit_offset (ทดสอบและตั้งค่าบิต) - ตรวจสอบและตั้งค่าบิต คำสั่งจะถ่ายโอนค่าบิตไปยังแฟล็ก CF จากนั้นตั้งค่าบิตที่จะตรวจสอบเป็น 1;

3) btr ตัวถูกดำเนินการ bit_offset (ทดสอบบิตและรีเซ็ต) - ตรวจสอบและรีเซ็ตบิต คำสั่งจะถ่ายโอนค่าบิตไปยังแฟล็ก CF จากนั้นตั้งค่าบิตนี้เป็น 0

4) ตัวถูกดำเนินการ btc, bit_shift (ทดสอบบิตและแปลง) - ตรวจสอบและแปลงบิต คำสั่งจะรวมค่าของบิตไว้ในแฟล็ก cf แล้วกลับค่าของบิตนั้น

คำสั่ง Shift

คำแนะนำในกลุ่มนี้ยังจัดเตรียมการจัดการบิตแต่ละตัวของตัวถูกดำเนินการ แต่ด้วยวิธีที่แตกต่างจากคำสั่งเชิงตรรกะที่กล่าวถึงข้างต้น

คำแนะนำในการเลื่อนทั้งหมดจะย้ายบิตในช่องตัวถูกดำเนินการไปทางซ้ายหรือขวาขึ้นอยู่กับรหัส opcode คำสั่งกะทั้งหมดมีโครงสร้างเดียวกัน - ตัวดำเนินการคัดลอก, shift_counter

จำนวนหลักที่เลื่อน - shift_count -ตั้งอยู่ที่ตำแหน่งของตัวถูกดำเนินการที่สองและสามารถระบุได้สองวิธี:

1) คงที่ซึ่งเกี่ยวข้องกับการระบุค่าคงที่ด้วยตัวดำเนินการในทันที

2) พลวัต,ซึ่งหมายถึงการใส่ค่าของ shift counter ลงใน cl register ก่อนดำเนินการตามคำสั่ง shift

ตามขนาดของการลงทะเบียน cl เป็นที่ชัดเจนว่าค่าของตัวนับการเปลี่ยนแปลงสามารถอยู่ในช่วงตั้งแต่ 0 ถึง 255 แต่ในความเป็นจริงแล้วสิ่งนี้ไม่เป็นความจริงทั้งหมด เพื่อวัตถุประสงค์ในการเพิ่มประสิทธิภาพ ไมโครโปรเซสเซอร์จะยอมรับค่าเท่านั้น ห้าบิตที่มีนัยสำคัญน้อยที่สุดตัวนับ เช่น ค่าอยู่ในช่วงตั้งแต่ 0 ถึง 31

คำแนะนำการเปลี่ยนทั้งหมดตั้งค่าสถานะพกพา cf

เมื่อบิตเลื่อนออกจากตัวถูกดำเนินการ อันดับแรกพวกมันจะชนกับธงพกพา โดยตั้งค่าให้เท่ากับค่าของบิตถัดไปที่อยู่นอกตัวถูกดำเนินการ บิตนี้จะไปต่อที่ใดขึ้นอยู่กับประเภทของคำสั่ง shift และอัลกอริทึมของโปรแกรม

คำสั่ง Shift สามารถแบ่งออกเป็นสองประเภทตามหลักการทำงาน:

1) คำสั่ง shift เชิงเส้น;

2) คำสั่งเปลี่ยนวงจร

คำสั่ง Shift เชิงเส้น

คำสั่งประเภทนี้รวมถึงคำสั่งที่เปลี่ยนตามอัลกอริทึมต่อไปนี้:

1) บิต "ที่ฉาย" ถัดไปตั้งค่าสถานะ CF

2) บิตที่ป้อนเข้าไปในตัวถูกดำเนินการจากปลายอีกด้านหนึ่งมีค่าเป็น 0;

3) เมื่อบิตถัดไปถูกเลื่อน มันจะเข้าสู่แฟล็ก CF ในขณะที่ค่าของบิตที่เลื่อนก่อนหน้าจะหายไป! คำสั่ง Shift เชิงเส้นแบ่งออกเป็นสองประเภทย่อย:

1) คำสั่ง shift เชิงเส้นเชิงตรรกะ

2) คำแนะนำการเลื่อนเชิงเส้นเลขคณิต

คำสั่ง shift เชิงเส้นเชิงตรรกะมีดังต่อไปนี้:

1) ตัวถูกดำเนินการ shl, shift_counter (Shift Logical Left) – เลื่อนโลจิคัลไปทางซ้าย เนื้อหาของตัวถูกดำเนินการถูกเลื่อนไปทางซ้ายตามจำนวนบิตที่ระบุโดย shift_count ทางด้านขวา (ในตำแหน่งของบิตที่มีนัยสำคัญน้อยที่สุด) จะใส่ศูนย์

2) ตัวถูกดำเนินการ shr, shift_count (Shift Logical Right) – เลื่อนโลจิคัลไปทางขวา เนื้อหาของตัวถูกดำเนินการถูกเลื่อนไปทางขวาตามจำนวนบิตที่ระบุโดย shift_count ทางด้านซ้าย (ในตำแหน่งบิตเครื่องหมายที่สำคัญที่สุด) ป้อนศูนย์

รูปที่ 30 แสดงวิธีการทำงานของคำสั่งเหล่านี้

ข้าว. 30. รูปแบบการทำงานของคำสั่งกะตรรกะเชิงเส้น


คำสั่งเลื่อนเชิงเส้นเลขคณิตแตกต่างจากคำสั่งเลื่อนเชิงตรรกะตรงที่พวกมันทำงานบนบิตเครื่องหมายของตัวถูกดำเนินการด้วยวิธีพิเศษ

1) ตัวดำเนินการ sal, shift_counter (Shift Arithmetic Left) – เลื่อนเลขคณิตไปทางซ้าย เนื้อหาของตัวถูกดำเนินการถูกเลื่อนไปทางซ้ายตามจำนวนบิตที่ระบุโดย shift_count ทางด้านขวา (ในตำแหน่งของบิตที่มีนัยสำคัญน้อยที่สุด) ให้ป้อนศูนย์ คำสั่ง sal ไม่ได้รักษาเครื่องหมาย แต่ ตั้งธงพร้อม/กรณีเปลี่ยนป้ายบิตถัดไปที่จะก้าวหน้า มิฉะนั้น คำสั่ง sal จะเหมือนกับคำสั่ง shl ทุกประการ

2) sar ตัวถูกดำเนินการ shift_counter (Shift Arithmetic Right) – การเลื่อนไปทางขวาทางเลขคณิต เนื้อหาของตัวถูกดำเนินการจะเลื่อนไปทางขวาตามจำนวนบิตที่ระบุโดยค่า shift_countเลขศูนย์จะถูกแทรกเข้าไปในตัวถูกดำเนินการทางด้านซ้าย คำสั่ง sar จะรักษาเครื่องหมายไว้ เรียกคืนหลังจากการเลื่อนบิตแต่ละครั้ง

รูปที่ 31 แสดงวิธีการทำงานของคำสั่ง shift เลขคณิตเชิงเส้น


ข้าว. 31. รูปแบบการทำงานของคำสั่ง shift เลขคณิตเชิงเส้น

หมุนคำสั่ง

คำแนะนำในการเลื่อนแบบวนรอบประกอบด้วยคำแนะนำที่เก็บค่าของบิตที่เลื่อน คำแนะนำในการเปลี่ยนเกียร์มีสองประเภท:

1) คำสั่งเปลี่ยนวงจรอย่างง่าย

2) คำสั่ง cyclic shift ผ่านทาง carry flag cf

ให้กับทีมงาน วัฏจักรอย่างง่ายเฉือนรวมถึง:

1) ตัวดำเนินการ rol, shift_counter (หมุนซ้าย) – เลื่อนเป็นวงกลมไปทางซ้าย เนื้อหาของตัวถูกดำเนินการจะเลื่อนไปทางซ้ายตามจำนวนบิตที่ระบุโดยตัวถูกดำเนินการ shift_countบิตที่เลื่อนไปทางซ้ายจะถูกเขียนไปยังตัวถูกดำเนินการเดียวกันจากด้านขวา

2) ตัวดำเนินการ gog, counter_shifts (หมุนไปทางขวา) - เลื่อนเป็นวงกลมไปทางขวา เนื้อหาของตัวถูกดำเนินการจะเลื่อนไปทางขวาตามจำนวนบิตที่ระบุโดยตัวถูกดำเนินการ shift_countบิตที่เลื่อนไปทางขวาจะถูกเขียนไปยังตัวถูกดำเนินการตัวเดียวกันทางด้านซ้าย

ข้าว. 32. รูปแบบการทำงานของคำสั่งของการเปลี่ยนแปลงแบบวนรอบอย่างง่าย


ดังที่เห็นได้จากรูปที่ 32 คำแนะนำของการเปลี่ยนแปลงแบบวนรอบอย่างง่ายในระหว่างการทำงานดำเนินการที่มีประโยชน์อย่างหนึ่ง กล่าวคือ: บิตที่เลื่อนแบบวนซ้ำไม่ได้ถูกแทรกเข้าไปในตัวถูกดำเนินการจากปลายอีกด้านหนึ่งเท่านั้น แต่ในขณะเดียวกัน ค่าจะกลายเป็นค่าของธง CE

หมุนคำสั่ง ผ่านแครี่แฟล็ก CFแตกต่างจากคำสั่ง cyclic shift ทั่วไปตรงที่บิตที่ถูกเลื่อนไม่ได้ป้อนตัวถูกดำเนินการทันทีจากปลายอีกด้าน แต่ก่อนอื่นจะถูกเขียนไปที่ค่าสถานะพกพา CE การดำเนินการถัดไปของคำสั่งกะนี้เท่านั้น (โดยมีเงื่อนไขว่าดำเนินการเป็นรอบ) นำไปสู่การวางบิตขั้นสูงก่อนหน้านี้จากปลายอีกด้านของตัวถูกดำเนินการ(รูปที่ 33)

คำสั่ง Shift แบบวนรอบ ผ่านการถือธงสิ่งต่อไปนี้เกี่ยวข้องกัน:

1) ตัวดำเนินการ rcl, shift_count (หมุนไปทางซ้าย) – เลื่อนไปทางซ้ายเป็นวงกลมผ่านตัวดำเนินการ

เนื้อหาของตัวถูกดำเนินการจะเลื่อนไปทางซ้ายตามจำนวนบิตที่ระบุโดยตัวถูกดำเนินการ shift_countบิตที่ถูกเลื่อนกลายเป็นค่าของค่าสถานะพกพา cf

2) ตัวถูกดำเนินการ rsg, shift_counter (หมุนไปทางขวา) – เลื่อนไปทางขวาเป็นวงกลมผ่านตัวดำเนินการ

เนื้อหาของตัวถูกดำเนินการจะเลื่อนไปทางขวาตามจำนวนบิตที่ระบุโดยตัวถูกดำเนินการ shift_countบิตที่ถูกเลื่อนจะกลายเป็นค่าของ CF ธงพกพา

ข้าว. 33. หมุนคำแนะนำผ่าน Carry Flag CF


รูปที่ 33 แสดงให้เห็นว่าเมื่อเลื่อนผ่านธงพกพา องค์ประกอบระดับกลางจะปรากฏขึ้นโดยใช้ความช่วยเหลือ โดยเฉพาะอย่างยิ่ง สามารถเปลี่ยนบิตที่เลื่อนเป็นวงกลมได้ โดยเฉพาะอย่างยิ่ง ไม่ตรงกันลำดับบิต

ต่อจากนี้ไป ลำดับบิตที่ไม่ตรงกันหมายถึงการดำเนินการที่อนุญาตให้แปลและแยกส่วนที่จำเป็นของลำดับนี้ในทางใดทางหนึ่งและเขียนไปยังที่อื่น

คำสั่ง shift เพิ่มเติม

ชุดคำสั่งของไมโครโปรเซสเซอร์ Intel รุ่นล่าสุดที่เริ่มต้นด้วย i80386 ประกอบด้วยคำสั่ง Shift เพิ่มเติมที่ขยายความสามารถที่เรากล่าวถึงก่อนหน้านี้ นี่คือคำสั่ง shift ความแม่นยำสองเท่า: 1) ตัวถูกดำเนินการ sld_1, ตัวถูกดำเนินการ _2, shift_count - เลื่อนซ้ายแม่นยำสองเท่า คำสั่ง shld ทำการแทนที่โดยเลื่อนบิตของoperand_1ไปทางซ้าย เติมบิตไปทางขวาด้วยค่าของบิตที่ถูกแทนที่จากoperand_2 ตามแผนภาพในรูปที่ 34. จำนวนบิตที่เลื่อนถูกกำหนดโดยค่า shift_count, ตัวถูกดำเนินการ_2ไม่เปลี่ยนแปลง


ข้าว. 34. รูปแบบของคำสั่ง shld


2) ตัวดำเนินการ shrd_1, ตัวถูกดำเนินการ _2, shift_count - เลื่อนไปทางขวาด้วยความแม่นยำสองเท่า คำสั่งดำเนินการแทนที่โดยเลื่อนบิตของตัวถูกดำเนินการ_1 ไปทางขวา เติมบิตทางด้านซ้ายด้วยค่าของบิตที่ถูกแทนที่จากตัวถูกดำเนินการ_2 ตามโครงร่างในรูปที่ 35 จำนวนบิตที่ถูกเลื่อนถูกกำหนดโดย ค่า shift_count,ซึ่งสามารถอยู่ในช่วง 0...31 ค่านี้สามารถกำหนดโดยตัวถูกดำเนินการทันทีหรืออยู่ใน cl register ความหมาย ตัวถูกดำเนินการ_2ไม่เปลี่ยนแปลง

ข้าว. 35. รูปแบบของคำสั่ง shrd


ตามที่เราสังเกต คำสั่ง shld และ shrd เลื่อนได้ถึง 32 บิต แต่เนื่องจากลักษณะเฉพาะของการระบุตัวถูกดำเนินการและอัลกอริทึมการดำเนินการ คำสั่งเหล่านี้สามารถใช้เพื่อทำงานกับฟิลด์ที่มีความยาวสูงสุด 64 บิต

2. ควบคุมคำสั่งถ่ายโอน

เราได้ทำความคุ้นเคยกับบางทีมที่ฟอร์ม เชิงเส้นส่วนต่างๆ ของโปรแกรม โดยทั่วไปแล้วแต่ละรายการจะทำการแปลงหรือถ่ายโอนข้อมูล หลังจากนั้นไมโครโปรเซสเซอร์จะถ่ายโอนการควบคุมไปยังคำสั่งถัดไป แต่มีโปรแกรมน้อยมากที่ทำงานในลักษณะที่สอดคล้องกัน มักจะมีจุดในโปรแกรมที่ต้องตัดสินใจเกี่ยวกับคำสั่งที่จะดำเนินการต่อไป วิธีแก้ปัญหานี้อาจเป็น:

1) ไม่มีเงื่อนไข -ณ จุดนี้จำเป็นต้องถ่ายโอนการควบคุมไม่ใช่คำสั่งถัดไป แต่ไปยังคำสั่งอื่นซึ่งอยู่ห่างจากคำสั่งปัจจุบัน

2) เงื่อนไข -การตัดสินใจเกี่ยวกับคำสั่งที่จะดำเนินการต่อไปนั้นขึ้นอยู่กับการวิเคราะห์เงื่อนไขหรือข้อมูลบางอย่าง

โปรแกรมคือลำดับของคำสั่งและข้อมูลที่ใช้พื้นที่ RAM จำนวนหนึ่ง พื้นที่หน่วยความจำนี้สามารถอยู่ติดกันหรือประกอบด้วยหลายส่วน

คำสั่งโปรแกรมใดที่ควรดำเนินการต่อไป ไมโครโปรเซสเซอร์จะเรียนรู้จากเนื้อหาของรีจิสเตอร์คู่หนึ่ง cs:(จ)ip:

1) cs – การลงทะเบียนส่วนของรหัสซึ่งมีที่อยู่จริง (ฐาน) ของส่วนรหัสปัจจุบัน

2) eip/ip - รีจิสเตอร์พอยน์เตอร์คำสั่งซึ่งมีค่าแทนออฟเซ็ตในหน่วยความจำของคำสั่งถัดไปที่จะดำเนินการเมื่อเทียบกับจุดเริ่มต้นของส่วนรหัสปัจจุบัน

จะใช้รีจิสเตอร์ใดขึ้นอยู่กับโหมดการกำหนดแอดเดรสที่ตั้งไว้ use16 หรือ use32 ถ้าระบุ use 16 ก็จะใช้ ip ถ้า use32 ก็จะใช้ eip

ดังนั้นคำสั่งการถ่ายโอนการควบคุมจึงเปลี่ยนเนื้อหาของการลงทะเบียน cs และ eip / ip อันเป็นผลมาจากการที่ไมโครโปรเซสเซอร์เลือกสำหรับการดำเนินการไม่ใช่คำสั่งโปรแกรมถัดไปตามลำดับ แต่เป็นคำสั่งในส่วนอื่น ๆ ของโปรแกรม ไปป์ไลน์ภายในไมโครโปรเซสเซอร์ถูกรีเซ็ต

ตามหลักการของการทำงาน คำสั่งไมโครโปรเซสเซอร์ที่ให้องค์กรของการเปลี่ยนแปลงในโปรแกรมสามารถแบ่งออกเป็น 3 กลุ่ม:

1. การถ่ายโอนคำสั่งควบคุมแบบไม่มีเงื่อนไข:

1) คำสั่งสาขาที่ไม่มีเงื่อนไข

2) คำสั่งเรียกโพรซีเดอร์และส่งคืนจากโพรซีเดอร์

3) คำสั่งเรียกการขัดจังหวะของซอฟต์แวร์และส่งคืนจากการขัดจังหวะของซอฟต์แวร์

2. คำสั่งสำหรับการถ่ายโอนการควบคุมแบบมีเงื่อนไข:

1) คำสั่งกระโดดตามผลลัพธ์ของคำสั่งเปรียบเทียบ p;

2) คำสั่งการเปลี่ยนแปลงตามสถานะของการตั้งค่าสถานะบางอย่าง

3) คำแนะนำสำหรับการกระโดดผ่านเนื้อหาของการลงทะเบียน esx/cx

3. คำสั่งควบคุมวงจร:

1) คำสั่งสำหรับจัดวงจรด้วยตัวนับ ехх / сх;

2) คำสั่งสำหรับจัดระเบียบวงจรด้วยตัวนับ ех/сх โดยมีความเป็นไปได้ที่จะออกจากวงจรก่อนกำหนดโดยมีเงื่อนไขเพิ่มเติม

การกระโดดแบบไม่มีเงื่อนไข

การอภิปรายก่อนหน้านี้ได้เปิดเผยรายละเอียดบางประการของกลไกการเปลี่ยนแปลง คำสั่งข้ามแก้ไขรีจิสเตอร์ตัวชี้คำสั่ง eip/ip และอาจเป็นรีจิสเตอร์โค้ด cs สิ่งที่จำเป็นต้องแก้ไขขึ้นอยู่กับ:

1) ประเภทของตัวถูกดำเนินการในคำสั่งสาขาที่ไม่มีเงื่อนไข (ใกล้หรือไกล)

2) จากตัวบ่งชี้ก่อนที่อยู่การข้าม (ในคำสั่งการกระโดด) ตัวดัดแปลง;ในกรณีนี้ ที่อยู่ข้ามสามารถอยู่ในคำสั่งโดยตรง (ข้ามโดยตรง) หรือในรีจิสเตอร์หรือเซลล์หน่วยความจำ (กระโดดทางอ้อม)

ตัวดัดแปลงสามารถรับค่าต่อไปนี้:

1) ใกล้ ptr - การเปลี่ยนโดยตรงไปยังป้ายกำกับภายในส่วนรหัสปัจจุบัน เฉพาะการลงทะเบียน eip/ip เท่านั้นที่แก้ไข (ขึ้นอยู่กับประเภทเซ็กเมนต์รหัส use16 หรือ use32 ที่ระบุ) ตามที่อยู่ (ป้ายกำกับ) ที่ระบุในคำสั่งหรือนิพจน์โดยใช้สัญลักษณ์การแยกค่า - $;

2) far ptr - การเปลี่ยนโดยตรงไปยังป้ายกำกับในส่วนรหัสอื่น ที่อยู่ข้ามถูกระบุเป็นตัวถูกดำเนินการทันทีหรือที่อยู่ (ฉลาก) และประกอบด้วยตัวเลือก 16 บิตและออฟเซ็ต 16/32 บิต ซึ่งโหลดลงในการลงทะเบียน cs และ ip/eip ตามลำดับ

3) word ptr - การเปลี่ยนทางอ้อมไปยังป้ายกำกับภายในส่วนรหัสปัจจุบัน เฉพาะ eip/ip เท่านั้นที่ถูกแก้ไข (โดยค่าออฟเซ็ตจากหน่วยความจำที่แอดเดรสที่ระบุในคำสั่ง หรือจากรีจิสเตอร์) ขนาดออฟเซ็ต 16 หรือ 32 บิต;

4) dword ptr - การเปลี่ยนทางอ้อมไปยังป้ายกำกับในส่วนรหัสอื่น การลงทะเบียนทั้งสองได้รับการแก้ไข (ด้วยค่าจากหน่วยความจำ - และจากหน่วยความจำเท่านั้นจากการลงทะเบียน) - cs และ eip / ip คำ/dword แรกของที่อยู่นี้แสดงถึง offset และถูกโหลดลงใน ip/eip; คำที่สอง/สามถูกโหลดลงใน cs jmp คำสั่งกระโดดแบบไม่มีเงื่อนไข

ไวยากรณ์คำสั่งสำหรับสาขาที่ไม่มีเงื่อนไขคือ jmp [ตัวดัดแปลง] jump_address - สาขาที่ไม่มีเงื่อนไขโดยไม่บันทึกข้อมูลเกี่ยวกับจุดส่งคืน

Jump_address คือที่อยู่ในรูปแบบของป้ายกำกับหรือที่อยู่ของพื้นที่หน่วยความจำซึ่งมีตัวชี้กระโดดอยู่

โดยรวมแล้ว ในระบบคำสั่งไมโครโปรเซสเซอร์มีรหัสคำสั่งเครื่องหลายรหัสสำหรับ Jump JMP แบบไม่มีเงื่อนไข

ความแตกต่างถูกกำหนดโดยระยะเปลี่ยนผ่านและวิธีการระบุที่อยู่เป้าหมาย พิสัยการเปลี่ยนแปลงถูกกำหนดโดยตำแหน่งของตัวถูกดำเนินการ กระโดด_ที่อยู่ที่อยู่นี้อาจอยู่ในส่วนรหัสปัจจุบันหรือในส่วนอื่น ในกรณีแรกเรียกว่าการเปลี่ยนแปลง การแบ่งส่วน,หรือ ปิด,ในวินาที - อินเตอร์เซกเมนต์,หรือ ห่างไกลการข้ามภายในเซกเมนต์จะถือว่าเฉพาะเนื้อหาของการลงทะเบียน eip/ip เท่านั้นที่เปลี่ยนแปลง

มีสามตัวเลือกสำหรับการใช้คำสั่ง jmp ภายในเซ็กเมนต์:

1) สั้นตรง

2) ตรง;

3) ทางอ้อม


ขั้นตอน

ภาษาแอสเซมบลีมีเครื่องมือหลายอย่างที่ช่วยแก้ปัญหาการทำซ้ำส่วนของโค้ด เหล่านี้รวมถึง:

1) กลไกของขั้นตอน;

2) แอสเซมเบลอร์มาโคร;

3) กลไกการขัดจังหวะ

ขั้นตอนที่มักเรียกกันว่า รูทีนย่อยเป็นหน่วยการทำงานพื้นฐานของการสลายตัว (แบ่งออกเป็นหลายส่วน) ของงานบางอย่าง โพรซีเดอร์คือกลุ่มของคำสั่งสำหรับแก้ไขงานย่อยเฉพาะ และมีวิธีการรับการควบคุมจากจุดที่เรียกงานในระดับที่สูงกว่าและส่งคืนการควบคุมไปยังจุดนี้

ในกรณีที่ง่ายที่สุด โปรแกรมอาจประกอบด้วยขั้นตอนเดียว กล่าวอีกนัยหนึ่ง โพรซีเดอร์สามารถกำหนดเป็นชุดคำสั่งที่มีรูปแบบเหมาะสม ซึ่งอธิบายเพียงครั้งเดียว สามารถเรียกใช้ได้ทุกที่ในโปรแกรมหากจำเป็น

เพื่ออธิบายลำดับของคำสั่งเป็นขั้นตอนในภาษาแอสเซมบลี จะใช้คำสั่งสองคำสั่ง: PROC และ ENDP

ไวยากรณ์คำอธิบายขั้นตอนมีดังนี้ (รูปที่ 36)


ข้าว. 36. ไวยากรณ์ของคำอธิบายขั้นตอนในโปรแกรม


รูปที่ 36 แสดงให้เห็นว่าในส่วนหัวของขั้นตอน (คำสั่ง PROC) เฉพาะชื่อขั้นตอนเท่านั้นที่บังคับ ในบรรดาตัวดำเนินการจำนวนมากของคำสั่ง PROC ควรเน้น [ระยะทาง] แอตทริบิวต์นี้สามารถรับค่าใกล้หรือไกลและระบุความเป็นไปได้ในการเรียกขั้นตอนจากส่วนรหัสอื่น ตามค่าเริ่มต้น แอตทริบิวต์ [ระยะทาง] จะถูกตั้งค่าให้ใกล้

ขั้นตอนสามารถวางไว้ที่ใดก็ได้ในโปรแกรม แต่ในลักษณะที่ไม่ได้รับการควบคุมแบบสุ่ม หากขั้นตอนถูกแทรกเข้าไปในสตรีมคำสั่งทั่วไป ไมโครโปรเซสเซอร์จะรับรู้คำแนะนำของขั้นตอนโดยเป็นส่วนหนึ่งของสตรีมนี้ และตามนั้น จะดำเนินการตามคำแนะนำของขั้นตอน

การกระโดดแบบมีเงื่อนไข

ไมโครโปรเซสเซอร์มี 18 คำสั่งกระโดดแบบมีเงื่อนไข คำสั่งเหล่านี้ช่วยให้คุณตรวจสอบ:

1) ความสัมพันธ์ระหว่างตัวถูกดำเนินการกับเครื่องหมาย (“มาก - น้อย”);

2) ความสัมพันธ์ระหว่างตัวถูกดำเนินการโดยไม่มีเครื่องหมาย ("สูงกว่า - ต่ำกว่า");

3) สถานะของธงเลขคณิต ZF, SF, CF, OF, PF (แต่ไม่ใช่ AF)

คำสั่งกระโดดแบบมีเงื่อนไขมีไวยากรณ์เหมือนกัน:

jcc jump_label

อย่างที่คุณเห็นรหัสช่วยจำของคำสั่งทั้งหมดเริ่มต้นด้วย "j" - จากคำ กระโดด(เด้ง), ของเธอ -ระบุเงื่อนไขเฉพาะที่จะแยกวิเคราะห์โดยคำสั่ง

เกี่ยวกับตัวดำเนินการ Jump_label,จากนั้นป้ายกำกับนี้สามารถอยู่ในส่วนรหัสปัจจุบันเท่านั้น ไม่อนุญาตให้ถ่ายโอนการควบคุมระหว่างส่วนในการกระโดดแบบมีเงื่อนไข ในเรื่องนี้ ไม่มีคำถามเกี่ยวกับตัวดัดแปลง ซึ่งมีอยู่ในไวยากรณ์ของคำสั่งกระโดดแบบไม่มีเงื่อนไข ในไมโครโปรเซสเซอร์รุ่นแรกๆ (i8086, i80186 และ i80286) คำสั่งสาขาแบบมีเงื่อนไขสามารถข้ามสั้นๆ ได้เท่านั้น จาก -128 ถึง +127 ไบต์จากคำสั่งตามคำสั่งสาขาแบบมีเงื่อนไข เริ่มต้นด้วยไมโครโปรเซสเซอร์รุ่น 80386 ข้อจำกัดนี้จะถูกลบออก แต่อย่างที่คุณเห็น เฉพาะในส่วนโค้ดปัจจุบันเท่านั้น

ในการตัดสินใจว่าการควบคุมจะถูกโอนไปยังคำสั่ง Jump แบบมีเงื่อนไข จะต้องสร้างเงื่อนไขขึ้นก่อน โดยพิจารณาจากการตัดสินใจโอนการควบคุม

แหล่งที่มาของเงื่อนไขดังกล่าวสามารถ:

1) คำสั่งใด ๆ ที่เปลี่ยนสถานะของธงเลขคณิต

2) คำสั่งเปรียบเทียบ p ซึ่งเปรียบเทียบค่าของตัวถูกดำเนินการสองตัว

3) สถานะของการลงทะเบียน esx/cx


คำสั่งเปรียบเทียบ cmp

คำสั่งเปรียบเทียบหน้ามีวิธีการทำงานที่น่าสนใจ มันเหมือนกับคำสั่งการลบทุกประการ - ตัวถูกดำเนินการย่อย, ตัวถูกดำเนินการ_2

คำสั่ง p เช่นคำสั่งย่อย ลบตัวถูกดำเนินการและตั้งค่าสถานะ สิ่งเดียวที่ไม่ทำคือเขียนผลลัพธ์ของการลบแทนตัวถูกดำเนินการตัวแรก

ไวยากรณ์ของคำสั่ง str - stroperand_1,operand_2 (เปรียบเทียบ) - เปรียบเทียบตัวถูกดำเนินการสองตัวและตั้งค่าสถานะตามผลลัพธ์ของการเปรียบเทียบ

แฟล็กที่ตั้งค่าโดยคำสั่ง p สามารถวิเคราะห์ได้โดยคำสั่งแบรนช์แบบมีเงื่อนไขพิเศษ ก่อนที่เราจะดูพวกเขา เรามาใส่ใจกันสักนิดเกี่ยวกับตัวช่วยจำของคำสั่งกระโดดแบบมีเงื่อนไขเหล่านี้ (ตารางที่ 16) การทำความเข้าใจสัญกรณ์เมื่อสร้างชื่อของคำสั่งข้ามแบบมีเงื่อนไข (องค์ประกอบในชื่อของคำสั่ง jcc เรากำหนดไว้) จะอำนวยความสะดวกในการท่องจำและการใช้งานจริงเพิ่มเติม

ตารางที่ 16. ความหมายของตัวย่อในชื่อคำสั่ง jcc
ตารางที่ 17. รายการคำสั่งสาขาแบบมีเงื่อนไขสำหรับคำสั่ง str ตัวถูกดำเนินการ_1, ตัวถูกดำเนินการ_2

อย่าแปลกใจกับข้อเท็จจริงที่ว่ารหัสช่วยจำที่แตกต่างกันหลายคำสั่งของเงื่อนไขสาขาสอดคล้องกับค่าสถานะเดียวกัน (พวกมันถูกแยกออกจากกันด้วยเครื่องหมายทับในตารางที่ 17) ความแตกต่างในชื่อนี้เกิดจากความต้องการของนักพัฒนาไมโครโปรเซสเซอร์ที่ต้องการทำให้ง่ายต่อการใช้คำสั่งกระโดดแบบมีเงื่อนไขร่วมกับคำสั่งบางกลุ่ม ดังนั้นชื่อที่แตกต่างกันจึงสะท้อนถึงการวางแนวการทำงานที่แตกต่างกัน อย่างไรก็ตามความจริงที่ว่าคำสั่งเหล่านี้ตอบสนองต่อแฟล็กเดียวกันทำให้เทียบเท่าและเท่าเทียมกันในโปรแกรม ดังนั้นในตารางที่ 17 จึงไม่จัดกลุ่มตามชื่อ แต่ตามค่าของแฟล็ก (เงื่อนไข) ที่พวกเขาตอบสนอง


คำสั่งสาขาแบบมีเงื่อนไขและค่าสถานะ

การกำหนดระบบช่วยจำของคำสั่งกระโดดแบบมีเงื่อนไขบางอย่างสะท้อนถึงชื่อของแฟล็กที่ใช้งาน และมีโครงสร้างดังต่อไปนี้: อักขระ "j" มาก่อน (กระโดด,การเปลี่ยนแปลง) ส่วนที่สองคือการกำหนดแฟล็กหรือสัญลักษณ์ปฏิเสธ "n" ตามด้วยชื่อของแฟล็ก โครงสร้างทีมนี้สะท้อนถึงจุดประสงค์ หากไม่มีอักขระ "n" สถานะของแฟล็กจะถูกตรวจสอบ หากมีค่าเท่ากับ 1 จะมีการเปลี่ยนไปใช้เลเบลกระโดด หากมีสัญลักษณ์ "n" สถานะของแฟล็กจะถูกตรวจสอบความเท่าเทียมกันเป็น 0 และหากสำเร็จ จะมีการข้ามไปที่ป้ายกำกับการกระโดด

ตัวช่วยจำคำสั่ง ชื่อแฟล็ก และเงื่อนไขการกระโดดแสดงในตารางที่ 18 คำสั่งเหล่านี้สามารถใช้ต่อจากคำสั่งใดๆ ที่ปรับเปลี่ยนแฟล็กที่ระบุ

ตารางที่ 18. คำสั่งกระโดดแบบมีเงื่อนไขและค่าสถานะ

หากคุณดูตารางที่ 17 และ 18 อย่างใกล้ชิด คุณจะเห็นว่าคำสั่งกระโดดแบบมีเงื่อนไขจำนวนมากในนั้นเทียบเท่ากัน เนื่องจากทั้งสองคำสั่งอิงตามการวิเคราะห์ของแฟล็กเดียวกัน


คำแนะนำการข้ามแบบมีเงื่อนไขและการลงทะเบียน esx/cx

สถาปัตยกรรมของไมโครโปรเซสเซอร์เกี่ยวข้องกับการใช้งานเฉพาะของการลงทะเบียนจำนวนมาก ตัวอย่างเช่น ใช้รีจิสเตอร์ EAX / AX / AL เป็นแอคคูมูเลเตอร์ และใช้รีจิสเตอร์ BP, SP เพื่อทำงานกับสแต็ก การลงทะเบียน ECX / CX ยังมีวัตถุประสงค์การทำงานบางอย่าง: ดำเนินการตามบทบาท เคาน์เตอร์ในคำสั่งควบคุมลูปและเมื่อทำงานกับสตริงอักขระ เป็นไปได้ที่คำสั่งสาขาแบบมีเงื่อนไขที่เกี่ยวข้องกับการลงทะเบียน esx/cx จะถูกระบุอย่างถูกต้องมากกว่าจากกลุ่มคำสั่งนี้

ไวยากรณ์สำหรับคำสั่งสาขาเงื่อนไขนี้คือ:

1) jcxz jump_label (กระโดดถ้า ex เป็นศูนย์) – กระโดดถ้า сх เป็นศูนย์

2) jecxz jump_label (กระโดดเท่ากับ ех ศูนย์) – กระโดดถ้า ех เป็นศูนย์

คำสั่งเหล่านี้มีประโยชน์มากเมื่อวนซ้ำและเมื่อทำงานกับสตริงอักขระ

ควรสังเกตว่ามีข้อจำกัดในคำสั่ง jcxz/jecxz ไม่เหมือนกับคำสั่งการถ่ายโอนแบบมีเงื่อนไขอื่นๆ คำสั่ง jcxz/jecxz สามารถระบุการกระโดดแบบสั้น -128 ไบต์หรือ +127 ไบต์จากคำสั่งที่ตามมา

องค์กรของวัฏจักร

อย่างที่คุณทราบวัฏจักรเป็นโครงสร้างอัลกอริทึมที่สำคัญโดยที่ไม่มีการใช้งานซึ่งอาจไม่มีโปรแกรมใดสามารถทำได้ คุณสามารถจัดระเบียบการดำเนินการแบบวนซ้ำของส่วนใดส่วนหนึ่งของโปรแกรมได้ ตัวอย่างเช่น การใช้การถ่ายโอนคำสั่งควบคุมแบบมีเงื่อนไขหรือคำสั่ง jmp แบบไม่มีเงื่อนไข ด้วยการจัดวงจรดังกล่าว การดำเนินการทั้งหมดสำหรับองค์กรจะดำเนินการด้วยตนเอง แต่เนื่องจากความสำคัญขององค์ประกอบอัลกอริทึมดังกล่าวเป็นวัฏจักร ผู้พัฒนาไมโครโปรเซสเซอร์จึงแนะนำกลุ่มคำสั่งสามคำสั่งในระบบคำสั่ง ซึ่งอำนวยความสะดวกในการเขียนโปรแกรมของวัฏจักร คำสั่งเหล่านี้ยังใช้รีจิสเตอร์ esx/cx เป็น ตัวนับรอบ

ให้คำอธิบายสั้น ๆ ของคำสั่งเหล่านี้: 1) loop jump_label (Loop) - ทำซ้ำลูป คำสั่งอนุญาตให้คุณจัดระเบียบการวนซ้ำคล้ายกับการวนซ้ำในภาษาระดับสูงพร้อมการลดตัวนับการวนซ้ำโดยอัตโนมัติ หน้าที่ของทีมคือการดำเนินการต่อไปนี้:

b) เปรียบเทียบรีจิสเตอร์ ECX/CX กับศูนย์: ถ้า (ECX/CX) = 0 การควบคุมจะถูกถ่ายโอนไปยังคำสั่งถัดไปหลังจากลูป

2) loope/loopz jump_label

คำสั่ง loope และ loopz เป็นคำพ้องความหมายเดียวกัน การทำงานของคำสั่งคือการดำเนินการต่อไปนี้:

ก) การลดลงของการลงทะเบียน ECX/CX;

c) การวิเคราะห์สถานะของแฟล็กศูนย์ ZF ถ้า (ECX/CX) = 0 หรือ XF = 0 การควบคุมจะถูกถ่ายโอนไปยังคำสั่งถัดไปหลังจากลูป

3) loopne/loopnz jump_label

คำสั่ง loopne และ loopnz เป็นคำพ้องความหมายเดียวกัน การทำงานของคำสั่งคือการดำเนินการต่อไปนี้:

ก) การลดลงของการลงทะเบียน ECX/CX;

b) เปรียบเทียบการลงทะเบียน ECX/CX กับศูนย์;

c) การวิเคราะห์สถานะของแฟล็กศูนย์ ZF: ถ้า (ECX/CX) = 0 หรือ ZF = 1 การควบคุมจะถูกถ่ายโอนไปยังคำสั่งถัดไปหลังจากลูป

คำสั่ง loope/loopz และ loopne/loopnz นั้นกลับกันในการดำเนินการ พวกเขาขยายการดำเนินการของคำสั่งลูปโดยแยกวิเคราะห์แฟล็ก zf เพิ่มเติม ซึ่งทำให้สามารถจัดระเบียบการออกจากลูปก่อนกำหนดได้ โดยใช้แฟล็กนี้เป็นตัวบ่งชี้

ข้อเสียของคำสั่งวนซ้ำ loop, loope/loopz และ loopne/loopnz คือใช้เฉพาะการกระโดดสั้นๆ (-128 ถึง +127 ไบต์) ในการทำงานกับลูปแบบยาว คุณจะต้องใช้การกระโดดแบบมีเงื่อนไขและคำสั่ง jmp ดังนั้นพยายามทำให้เชี่ยวชาญทั้งสองวิธีในการจัดระเบียบลูป

ตรรกะ OR, โมดูโล 2 นอกจากนี้ (XOR);
  • การเปลี่ยนแปลงทางตรรกะ เลขคณิต และวงจร
  • ตรวจสอบบิตและตัวถูกดำเนินการ
  • การตั้งค่าและการล้างบิต (ธง) การลงทะเบียนสถานะโปรเซสเซอร์ ( ป.ล).
  • คำสั่งลอจิกช่วยให้สามารถคำนวณฟังก์ชันลอจิกพื้นฐานทีละบิตจากตัวดำเนินการอินพุตสองตัว นอกจากนี้ การดำเนินการ AND ( และ ) ยังใช้เพื่อบังคับการล้างบิตที่ระบุ (ในฐานะหนึ่งในตัวถูกดำเนินการ สิ่งนี้ใช้รหัสมาสก์ ซึ่งบิตที่ต้องการการล้างจะถูกตั้งค่าเป็นศูนย์) การดำเนินการ OR (OR) ใช้เพื่อบังคับบิตที่ตั้งไว้ (ในฐานะหนึ่งในตัวถูกดำเนินการ จะใช้รหัสมาสก์ ซึ่งบิตที่ต้องตั้งค่าเป็นหนึ่งมีค่าเท่ากับหนึ่ง) การดำเนินการ XOR (XOR) ใช้เพื่อแปลงบิตที่กำหนด (ในฐานะหนึ่งในตัวถูกดำเนินการ จะใช้รหัสมาสก์ในการตั้งค่าบิตที่จะกลับด้านเป็นหนึ่งเดียว) คำสั่งต้องใช้ตัวถูกดำเนินการอินพุตสองตัวและสร้างตัวถูกดำเนินการเอาต์พุตหนึ่งตัว

    คำสั่ง shift ช่วยให้คุณสามารถเลื่อนรหัสตัวถูกดำเนินการทีละบิตไปทางขวา (ไปทางบิตล่าง) หรือไปทางซ้าย (ไปทางบิตที่สูงขึ้น) ประเภทของการเปลี่ยนแปลง (บูลีน เลขคณิต หรือวงจร) จะเป็นตัวกำหนดว่าค่าใหม่ของบิตที่มีนัยสำคัญที่สุด (เมื่อเลื่อนไปทางขวา) หรือบิตที่มีนัยสำคัญน้อยที่สุด (เมื่อเลื่อนไปทางซ้าย) จะเป็นเท่าใด และยังกำหนดว่าค่าเดิมของบิตที่มีนัยสำคัญที่สุด บิตจะถูกเก็บไว้ที่ไหนสักแห่ง (เมื่อเลื่อนไปทางซ้าย) หรือบิตที่มีนัยสำคัญน้อยที่สุด (เมื่อเลื่อนไปทางขวา) ตัวอย่างเช่น ในระหว่างการเลื่อนโลจิคัลไปทางขวา บิตที่สำคัญที่สุดของรหัสตัวดำเนินการจะถูกตั้งค่าเป็นศูนย์ และบิตที่มีนัยสำคัญน้อยที่สุดจะถูกเขียนเป็นค่าสถานะพกพาในรีจิสเตอร์สถานะตัวประมวลผล และด้วยการเลื่อนเลขคณิตไปทางขวา ค่าของบิตที่มีนัยสำคัญมากที่สุดยังคงเท่าเดิม (ศูนย์หรือหนึ่ง) บิตที่มีนัยสำคัญน้อยที่สุดจะถูกเขียนเป็นเครื่องหมายนำ

    การเลื่อนแบบหมุนช่วยให้คุณเลื่อนบิตของรหัสตัวถูกดำเนินการเป็นวงกลม (ตามเข็มนาฬิกาเมื่อเลื่อนไปทางขวาหรือทวนเข็มนาฬิกาเมื่อเลื่อนไปทางซ้าย) ในกรณีนี้ แหวนเปลี่ยนเกียร์อาจมีหรือไม่มีแฟล็กพกพาก็ได้ บิตค่าสถานะพกพา (ถ้าใช้) ถูกตั้งค่าเป็นบิตที่มีนัยสำคัญที่สุดสำหรับการหมุนไปทางซ้าย และบิตที่มีนัยสำคัญน้อยที่สุดสำหรับการหมุนไปทางขวา ดังนั้น ค่าของบิตแครี่แฟล็กจะถูกเขียนใหม่เป็นบิตที่มีนัยสำคัญน้อยที่สุดในการเลื่อนแบบวนซ้าย และไปยังบิตที่มีนัยสำคัญที่สุดในการเลื่อนแบบวนขวา

    ตัวอย่างเช่นในรูป 3.12 แสดงการดำเนินการโดยคำสั่ง shift ขวา

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


    ข้าว. 3.12.

    สุดท้าย คำสั่งในการตั้งค่าและล้างบิต การลงทะเบียนสถานะโปรเซสเซอร์ (นั่นคือแฟล็ก) อนุญาตให้คุณตั้งค่าหรือล้างแฟล็กใด ๆ ซึ่งสะดวกมาก แต่ละแฟล็กมักจะเชื่อมโยงกับสองคำสั่ง คำสั่งหนึ่งตั้งค่าเป็นหนึ่งและอีกคำสั่งรีเซ็ตเป็นศูนย์ ตัวอย่างเช่น ธงพกพา C (จาก Carry ) จะจับคู่กับ CLC (ชัดเจน) และ SEC หรือ STC (ชุด)

    3.3.4. คำสั่งกระโดด

    คำสั่งกระโดดได้รับการออกแบบมาเพื่อจัดระเบียบการวนซ้ำ แบรนช์ การเรียกไปยังรูทีนย่อย ฯลฯ ทุกชนิด กล่าวคือ ขัดขวางการไหลตามลำดับของโปรแกรม คำสั่งเหล่านี้เขียนค่าใหม่ลงในรีจิสเตอร์ตัวนับคำสั่ง และทำให้โปรเซสเซอร์กระโดดไม่ข้ามไปยังคำสั่งถัดไปตามลำดับ แต่ไปที่คำสั่งอื่น ๆ ในหน่วยความจำของโปรแกรม บาง คำสั่งกระโดดจัดให้มีการย้อนกลับไปยังจุดที่เปลี่ยนผ่าน ที่อื่น ๆ ไม่ได้จัดเตรียมไว้สำหรับสิ่งนี้ หากมีการส่งคืน พารามิเตอร์ตัวประมวลผลปัจจุบันจะถูกจัดเก็บไว้ในสแต็ก หากไม่มีการส่งคืน พารามิเตอร์ตัวประมวลผลปัจจุบันจะไม่ถูกบันทึก

    คำสั่งกระโดดโดยไม่มีผลตอบแทนแบ่งออกเป็นสองกลุ่ม:

    • ทีม กระโดดไม่มีเงื่อนไข;
    • ทีม การกระโดดแบบมีเงื่อนไข.

    คำสั่งเหล่านี้ใช้คำว่า สาขา(สาขา)และ กระโดด(เด้ง).

    ทีม กระโดดไม่มีเงื่อนไขทำให้ข้ามไปยังที่อยู่ใหม่ไม่ว่าจะเกิดอะไรขึ้น อาจทำให้ข้ามไปยังค่าออฟเซ็ตที่ระบุ (ไปข้างหน้าหรือข้างหลัง) หรือไปยังที่อยู่หน่วยความจำที่ระบุ ค่าออฟเซ็ตหรือค่าแอดเดรสใหม่ถูกระบุเป็นตัวดำเนินการอินพุต

    ทีม การกระโดดแบบมีเงื่อนไขทำให้การเปลี่ยนแปลงไม่เสมอไป แต่เมื่อตรงตามเงื่อนไขที่ระบุเท่านั้น เงื่อนไขดังกล่าวมักจะเป็นค่าของแฟล็กในการลงทะเบียนสถานะตัวประมวลผล ( ป.ล). นั่นคือเงื่อนไขการเปลี่ยนเป็นผลลัพธ์ของการดำเนินการก่อนหน้านี้ที่เปลี่ยนค่าของแฟล็ก โดยรวมแล้วสามารถมีเงื่อนไขการเปลี่ยนแปลงดังกล่าวได้ตั้งแต่ 4 ถึง 16 ตัวอย่างคำสั่งต่างๆ การกระโดดแบบมีเงื่อนไข:

    • กระโดดถ้าเท่ากับศูนย์
    • กระโดดถ้าไม่ใช่ศูนย์
    • กระโดดหากมีการล้น
    • กระโดดถ้าไม่มีการล้น
    • กระโดดถ้ามากกว่าศูนย์
    • กระโดดถ้าน้อยกว่าหรือเท่ากับศูนย์
    ค่าใหม่ หากไม่ตรงตามเงื่อนไขการกระโดด ตัวนับคำสั่งจะเพิ่มขึ้น และโปรเซสเซอร์จะเลือกและดำเนินการคำสั่งถัดไปตามลำดับ

    คำสั่งเปรียบเทียบ ( ซี.เอ็ม.พี) นำหน้าคำสั่ง กระโดดแบบมีเงื่อนไข(หรือหลายคำสั่ง การกระโดดแบบมีเงื่อนไข). แต่แฟล็กสามารถตั้งค่าได้โดยคำสั่งอื่น ตัวอย่างเช่น คำสั่งส่งต่อข้อมูลเลขคณิตใด ๆ หรือ คำสั่งเชิงตรรกะ. โปรดทราบว่าเราเอง คำสั่งกระโดดแฟล็กไม่เปลี่ยนแปลง ซึ่งเพียงแค่ให้คุณตั้งค่าหลายๆ คำสั่งกระโดดทีละคน.

    การแบ่งปันหลายเงื่อนไขและ กระโดดไม่มีเงื่อนไขอนุญาตให้โปรเซสเซอร์ดำเนินการอัลกอริทึมแบบแยกย่อยของความซับซ้อนใด ๆ ตัวอย่างเช่นในรูป 3.13 แสดงการแยกสาขาของโปรแกรมออกเป็นสองสาขาตามด้วยการเชื่อมต่อและในรูป 3.14 - แยกออกเป็นสามสาขาตามด้วยการเชื่อมต่อ

    คำสั่งกระโดดด้วยการย้อนกลับไปยังจุดที่ทำการเปลี่ยนแปลง ใช้เพื่อรันรูทีนย่อย นั่นคือ โปรแกรมเสริม คำสั่งเหล่านี้เรียกอีกอย่างว่าคำสั่งเรียกโปรแกรมย่อย (ชื่อสามัญคือ CALL) การใช้รูทีนย่อยทำให้โครงสร้างของโปรแกรมหลักง่ายขึ้น ทำให้มีตรรกะมากขึ้น ยืดหยุ่น เขียนและดีบักได้ง่าย ในขณะเดียวกันก็ต้องคำนึงถึงว่าการใช้รูทีนย่อยอย่างแพร่หลายตามกฎแล้วจะเพิ่มเวลาดำเนินการของโปรแกรม


    ข้าว. 3.13.


    ข้าว. 3.14.

    ทั้งหมด คำสั่งกระโดดด้วยการส่งคืนถือว่าการกระโดดแบบไม่มีเงื่อนไข (พวกเขาไม่ได้ตรวจสอบแฟล็กใด ๆ ) อย่างไรก็ตาม พวกเขาต้องการตัวถูกดำเนินการอินพุตหนึ่งตัว ซึ่งสามารถระบุทั้งค่าสัมบูรณ์ของที่อยู่ใหม่และค่าชดเชยที่เพิ่มให้กับค่าที่อยู่ปัจจุบัน ค่าปัจจุบันของตัวนับโปรแกรม (ที่อยู่ปัจจุบัน) จะถูกเก็บไว้ก่อนที่สาขาจะถูกดำเนินการในกองซ้อน

    เพื่อกลับไปยังจุดรับสาย

    คำสั่งไมโครโปรเซสเซอร์

    ทีนี้มาดูคำสั่งที่ถูกดำเนินการให้ละเอียดยิ่งขึ้น ชุดคำสั่งทั้งหมดของไมโครโปรเซสเซอร์สามารถแบ่งออกเป็นหลายกลุ่ม

    กลุ่มแรก -นี้ คำสั่งเคลื่อนย้ายข้อมูลปฏิบัติตามคำสั่งเหล่านี้ ตัวประมวลผลจะคัดลอกเนื้อหาของเซลล์หน่วยความจำหนึ่งไปยังอีกเซลล์หนึ่ง คัดลอกข้อมูลจากเซลล์หน่วยความจำไปยังหนึ่งในรีจิสเตอร์ภายใน หรือในทางกลับกัน คัดลอกเนื้อหาของรีจิสเตอร์ไปยังหนึ่งในเซลล์หน่วยความจำ นอกจากนี้ ยังสามารถคัดลอกข้อมูลจากรีจิสเตอร์ภายในเครื่องหนึ่งไปยังอีกเครื่องหนึ่งได้

    ควรสังเกตว่าคำสั่งย้ายจริง ๆ แล้วไม่ได้ย้ายข้อมูลจากเซลล์หนึ่งไปอีกเซลล์ แต่คัดลอกข้อมูลนี้ การดำเนินการย้ายในเทคโนโลยีดิจิทัลไม่มีความหมาย ในความหมายทั่วไป ย้ายหมายถึงการเคลื่อนย้ายจากที่หนึ่งไปยังอีกที่หนึ่ง แต่ไม่สามารถลบข้อมูลออกจากเซลล์หน่วยความจำได้!

    บิตใด ๆ ของเซลล์หน่วยความจำมีค่าเท่ากับศูนย์หรือหนึ่งเสมอ นั่นคือมันประกอบด้วยตัวเลขเสมอ ดังนั้น ให้ย้ายคำสั่งอ่านไบต์ของข้อมูลจากเซลล์ต้นทางและเขียนไปยังเซลล์ปลายทาง ในกรณีนี้ ข้อมูลในเซลล์ต้นทางจะไม่เปลี่ยนแปลง

    บริษัท ที่สองกลุ่มเป็น คำสั่งการแปลงข้อมูลกลุ่มนี้ประกอบด้วยคำสั่งสำหรับการบวก การลบ การแปลงเชิงตรรกะ การเลื่อนหลัก ฯลฯ

    กลุ่มที่สามประกอบด้วย ควบคุมคำสั่งถ่ายโอนฉันต้องการพูดคุยเกี่ยวกับคำสั่งคลาสนี้โดยละเอียด เป็นการยากที่จะจินตนาการถึงโปรแกรมที่ประกอบด้วยชุดคำสั่งต่อเนื่องเพียงชุดเดียว อัลกอริทึมส่วนใหญ่ต้องการการแตกแขนงของโปรแกรม ซึ่งหมายความว่าโปรแกรมจะต้องสามารถดำเนินการตามลำดับของการกระทำที่แตกต่างกันขึ้นอยู่กับเงื่อนไขบางประการ

    ตัวอย่าง.

    สมมติว่าอุปกรณ์ไมโครโปรเซสเซอร์ของเรามีปุ่มควบคุม เมื่อคุณกดแต่ละปุ่ม จะต้องดำเนินการบางอย่าง ตัวอย่างเช่น เมื่อกดปุ่มหนึ่ง แอคทูเอเตอร์ควรหันไปทางซ้าย เมื่อคุณกดอีก- เลี้ยวขวา ฯลฯ เพื่อให้เป็นไปได้ โปรแกรมจะอ่านสถานะของปุ่มเป็นระยะๆ จากนั้นโปรแกรมควรประเมินสภาพของพวกเขา หากกดปุ่มแรก คำสั่งบางอย่างจะถูกดำเนินการ ออกรหัสไปยังพอร์ตที่เกี่ยวข้อง ซึ่งนำไปสู่การรวมเครื่องยนต์ในทิศทางไปข้างหน้า หากกดปุ่มที่สอง คำสั่งอื่นจะถูกดำเนินการ โดยออกรหัสที่แตกต่างไปจากเดิมอย่างสิ้นเชิงไปยังพอร์ตเดียวกัน รหัสนี้ควรทำให้เครื่องยนต์เปิดในทางกลับกัน

    เห็นได้ชัดว่าในการใช้อัลกอริทึมนี้จำเป็นต้องขัดจังหวะการดำเนินการคำสั่งตามลำดับ เพื่อให้โปรแกรมสามารถเปลี่ยนอัลกอริทึมของการทำงานขึ้นอยู่กับเงื่อนไขใด ๆ ระบบคำสั่งของโปรเซสเซอร์ใด ๆ จำเป็นต้องมีคำสั่งถ่ายโอนการควบคุม คำสั่งถ่ายโอนการควบคุมประกอบด้วยคำสั่งประเภทต่อไปนี้: คำสั่งกระโดดแบบมีเงื่อนไข; คำสั่งสาขาที่ไม่มีเงื่อนไข คำสั่งเพื่อข้ามไปยังรูทีนย่อย คำสั่งการจัดวงจร ลองพิจารณาคำสั่งเหล่านี้ตามลำดับ

    คำสั่งสาขาแบบมีเงื่อนไขและไม่มีเงื่อนไข

    คำสั่งทั้งสองประเภทนี้ออกแบบมาเพื่อขัดขวางการดำเนินการตามลำดับของโปรแกรมและเรียกสิ่งที่เรียกว่า การเปลี่ยนแปลงยิ่งกว่านั้น การเปลี่ยนแปลงตามเงื่อนไขจะเกิดขึ้นก็ต่อเมื่อตรงตามเงื่อนไขที่กำหนดเท่านั้น การข้ามแบบไม่มีเงื่อนไขจะดำเนินการเสมอเมื่อโปรแกรมพบคำสั่งที่เหมาะสม เงื่อนไขการเปลี่ยนแปลงสามารถเป็นหนึ่งในนิพจน์เชิงตรรกะต่อไปนี้:

    ♦ ค่าก เท่ากับค่า B;

    ♦ ค่าก ไม่เท่ากับค่า B;

    ♦ ค่าก น้อยค่า B;

    ♦ ค่าก มากกว่าค่า B;

    ♦ ค่าก น้อยกว่าหรือเท่ากับค่า B;

    ♦ ค่าก มากกว่าหรือเท่ากับขนาดของ V.

    ค่าสำหรับการเปรียบเทียบสามารถเป็นเนื้อหาของการลงทะเบียนตัวประมวลผลภายใน เนื้อหาของเซลล์หน่วยความจำ หรือค่าคงที่

    ตัวอย่าง.

    พิจารณาตัวอย่างการใช้การกระโดดแบบมีเงื่อนไขและไม่มีเงื่อนไข เพื่อความชัดเจน เราจะอธิบายสายคำสั่งในหน่วยความจำโปรแกรมเป็นลำดับขององค์ประกอบกราฟิก (ดูรูปที่ข้าว. 2.2). ความคืบหน้าของโปรแกรมจะแสดงด้วยลูกศร สี่เหลี่ยมแสดงถึงคำสั่งทั่วไป (คำสั่งการเคลื่อนไหวและคำสั่งการแปลงข้อมูล) วงกลมด้วยคำถาม- นี่คือคำสั่งกระโดดแบบมีเงื่อนไข องค์ประกอบเครื่องหมายอัศเจรีย์โค้งมน- นี่คือการเปลี่ยนแปลงที่ไม่มีเงื่อนไข โปรแกรมนี้มีสองสาขา ถ้าเงื่อนไขเป็นเท็จ ให้ดำเนินการ branch หมายเลข 1 ถ้าเงื่อนไข- จริง หมายเลขสาขา 2 จะถูกดำเนินการ

    สมมติว่าสาขาเงื่อนไขเปรียบเทียบรหัสของคีย์ที่กดกับค่าคงที่ จากนั้นสามารถเขียนการดำเนินการโดยคำสั่งเงื่อนไขได้ดังนี้: "หากรหัสของปุ่มที่กดคือ 0 ให้ไปที่การดำเนินการของสาขาหมายเลข 2"ดังนั้นหากไม่ตรงตามเงื่อนไข (เช่น หมายเลขที่อ่านคือ 1) โปรแกรมจะทำงานต่อไปในโหมดปกติ และจะดำเนินการตามหมายเลขสาขา 1 ต่อไป

    ในกลุ่มของคำสั่งถ่ายโอนการควบคุม คำสั่งสี่ประเภทถูกจำแนกออก: การกระโดดแบบไม่มีเงื่อนไข การกระโดดแบบมีเงื่อนไข การวนซ้ำ และการขัดจังหวะ .

    คำสั่งของการกระโดดแบบไม่มีเงื่อนไข รวม mnemocodes สามรายการ: JMP (สาขาที่ไม่มีเงื่อนไข), CALL (การโทรรูทีนย่อย) และ RET (การส่งคืนรูทีนย่อย)

    คำสั่ง JMP ช่วยให้คุณสามารถข้ามไปยังจุดใดก็ได้ในโปรแกรม ซึ่งอยู่ทั้งในส่วนของโปรแกรมปัจจุบันและในส่วนอื่น เมื่อข้ามไปในส่วนของโปรแกรมปัจจุบัน คำสั่ง JMP สามรูปแบบแรกจะถูกใช้

    รูปแบบแรกให้การเปลี่ยนไปยังจุดที่กำหนดโดยพลการของโปรแกรมภายในส่วนของโปรแกรมปัจจุบัน ซึ่งมีการเติมออฟเซ็ต 16 บิตให้กับเนื้อหา IP ในโค้ดเสริมของทั้งสอง ซึ่งบิตที่สำคัญที่สุดคือเครื่องหมาย รูปแบบที่สองที่สั้นลงช่วยให้คุณสามารถข้ามไปยังจุดในโปรแกรมที่อยู่ห่างจากคำสั่ง JMP ไม่เกิน -128-f-127 สุดท้าย รูปแบบที่สามโหลดตัวชี้คำสั่งด้วยตัวเลข 16 บิต ซึ่งอยู่ที่ที่อยู่การดำเนินการของ EA ซึ่งกำหนดโดยโพสต์ไบต์ การเปลี่ยนแปลงนี้เรียกว่าทางอ้อมเนื่องจากใช้การระบุที่อยู่ทางอ้อม

    หากต้องการใช้การกระโดดแบบไม่มีเงื่อนไขไปยังจุดโปรแกรมที่อยู่นอกเซกเมนต์โปรแกรมปัจจุบัน เมื่อจำเป็นต้องโหลดรีจิสเตอร์เซ็กเมนต์ CS ซ้ำ จะใช้รูปแบบที่สี่และห้าของคำสั่ง JMP

    รูปแบบที่สี่กำหนดการเปลี่ยนระหว่างกลุ่มโดยตรง ซึ่งไบต์ที่สองและสามของรูปแบบระบุที่อยู่สัมพัทธ์ของจุดเปลี่ยน และไบต์ที่สี่และห้าระบุค่า CS ใหม่ รูปแบบที่ห้า ใช้ postbyte ช่วยให้คุณสามารถกำหนดที่อยู่การดำเนินการ EA ซึ่งอยู่สัมพัทธ์ของจุดเปลี่ยน (ในหน่วยความจำไบต์ที่มีที่อยู่ EA, EA+1) และค่าใหม่ CS (ในหน่วยความจำไบต์ EA +2, EA+3).

    คำสั่ง CALL อนุญาตให้คุณเรียกรูทีนย่อยที่อยู่ทั้งในส่วนของโปรแกรมปัจจุบันและในพื้นที่หน่วยความจำอื่น มีรูปแบบเดียวกับคำสั่ง JMP ยกเว้นรูปแบบที่สั้นกว่า ซึ่งแตกต่างจากคำสั่ง JMP ในรูปแบบที่คล้ายกัน คำสั่ง CALL จะเขียนค่าปัจจุบันของรีจิสเตอร์เหล่านี้ลงในสแต็กโดยอัตโนมัติก่อนที่จะเปลี่ยนค่า IP หรือ IP และ CS ซึ่งทำให้แน่ใจว่าจุดส่งคืนจากรูทีนย่อยถูกจดจำ

    ในการส่งคืนจากรูทีนย่อย คำสั่ง RET จะถูกใช้ ภายใต้การดำเนินการซึ่งการควบคุมจะถูกถ่ายโอนไปยังที่อยู่ผู้ส่งซึ่งถูกผลักไปยังสแต็กระหว่างการดำเนินการของคำสั่ง CALL ก่อนหน้า เมื่อส่งคืนจากรูทีนย่อยที่อยู่ในเซ็กเมนต์โปรแกรมปัจจุบัน จะใช้รูปแบบสองรูปแบบแรกของคำสั่ง RET และรูปแบบที่สองแตกต่างจากรูปแบบแรกตรงที่ค่าคงที่จะถูกเพิ่มลงในเนื้อหาของตัวชี้สแต็ก ซึ่งเขียนในลำดับที่ 2 และ ไบต์ที่ 3 ของคำสั่ง ซึ่งช่วยให้การส่งคืนจากรูทีนย่อยสามารถรีเซ็ตพารามิเตอร์ที่เขียนลงในสแต็กได้พร้อมกันระหว่างการดำเนินการของรูทีนย่อยนี้และจะไม่ถูกใช้ในอนาคต

    สำหรับการส่งคืนระหว่างส่วน จะใช้รูปแบบ RET ที่สามและสี่ ซึ่งให้การกู้คืนเนื้อหาของตัวชี้คำสั่งและส่วนของโปรแกรม

    คำสั่งกระโดดแบบมีเงื่อนไขดำเนินการถ่ายโอนการควบคุมขึ้นอยู่กับผลลัพธ์ของการดำเนินการก่อนหน้านี้ มีการข้ามแบบมีเงื่อนไขสามประเภทที่ใช้เพื่อสร้างความสัมพันธ์ระหว่างหมายเลขที่ลงนาม หมายเลขที่ไม่ได้ลงนาม และหมายเลขที่กำหนดเอง ในสองสายพันธุ์แรก สำหรับอัตราส่วนเดียวกันระหว่างตัวเลข คำสั่งจำคำสั่งที่แตกต่างกันจะถูกเลือก เนื่องจากค่าสถานะที่แตกต่างกันจะสอดคล้องกับอัตราส่วนเดียวกันของตัวเลขที่ลงนามและไม่ได้ลงนาม

    ในระบบช่วยจำของคำสั่งกระโดดแบบมีเงื่อนไข เมื่อเปรียบเทียบตัวเลขที่มีเครื่องหมาย ตัวอักษรจะใช้เพื่อระบุเงื่อนไข "มากกว่า" G (มากกว่า- มากกว่า) และสำหรับการกำหนด - ตัวอักษร "น้อยกว่า" L (น้อยกว่า- น้อย). สำหรับเงื่อนไขที่คล้ายกัน เมื่อเปรียบเทียบตัวเลขที่ไม่ได้ลงนาม จะใช้ตัวอักษรตามลำดับ ก (บน- เกิน) และ บี (ด้านล่าง- ภายใต้). เงื่อนไขความเท่าเทียมกันจะแสดงด้วยตัวอักษร E (เท่ากับ- เท่ากับ) และการไม่ปฏิบัติตามเงื่อนไขบางประการ - โดยจดหมาย น (ไม่- ไม่). ควรสังเกตว่าอนุญาตให้ใช้รหัสช่วยจำที่แตกต่างกันสองรหัสสำหรับแต่ละคำสั่ง ตัวอย่างเช่น ตัวช่วยจำ JL และ JNGF มีค่าเท่ากันเนื่องจากเงื่อนไข "น้อยกว่า" และ "ไม่เกินหรือเท่ากับ" เหมือนกัน

    รายการที่สมบูรณ์ของตัวช่วยจำคำสั่ง เงื่อนไขที่ต้องตรวจสอบ ตลอดจนชุดค่าสถานะบูลีนที่สอดคล้องกันและความหมายจะแสดงอยู่ในตาราง 1.4.

    ตารางที่ 1.4

    รหัสช่วยจำคำสั่ง เงื่อนไข ความหมายของธง
    สำหรับหมายเลขที่ลงนาม
    JL/JNGE น้อยกว่า/ไม่เกินหรือเท่ากับ SF + OF = ล
    เจเอ็นแอล/เจจีอี ไม่น้อยกว่า/มากกว่าหรือเท่ากับ เอสเอฟ + ของ = 0
    JG/JNLE มากกว่า/ไม่น้อยกว่าหรือเท่ากับ (SF + OF) V ZF = 0
    JNG/JLE ไม่เกิน/น้อยกว่าหรือเท่ากับ สำหรับหมายเลขที่ไม่ได้ลงนาม (SF + OF) V ZF = ล
    เจบี/JNAE น้อยกว่า/ไม่เกินหรือเท่ากับ ซีเอฟ=1
    JNB/แจ้ ไม่น้อยกว่า/มากกว่าหรือเท่ากับ ซีเอฟ=0
    JA/JNBE มากกว่า ซีเอฟ วี แซดเอฟ = 0
    JNA/JBE ไม่มากสำหรับข้อมูลอื่น ๆ ซีเอฟ วี แซดเอฟ = 1
    JE/JZ เท่ากับ/ศูนย์ ZF = 1
    JNE/JNZ ไม่เท่ากัน/ศูนย์ แซดเอฟ = 0
    จส โดยลบ เอสเอฟ = 1
    จส บวก เอสเอฟ = 0
    ล้น OF=ล
    JNO โดยไม่มีการล้น ของ = 0
    JP/JPE ที่เท่าเทียมกัน พีเอฟ = 1
    มจพ./จพ ในความเสมอภาคที่คี่ พีเอฟ = 0

    คำสั่งกระโดดแบบมีเงื่อนไขทั้งหมดมีรูปแบบสองไบต์เหมือนกัน ไบต์แรกคือรหัสการดำเนินการ (COP) และไบต์ที่สองเป็นออฟเซ็ต 8 บิต ซึ่งถือว่าเป็นตัวเลขที่ลงนาม ดังนั้นจึงอนุญาตให้เปลี่ยนที่อยู่ได้ ในช่วงตั้งแต่ -128 ถึง +127 หากจำเป็นต้องมีการเปลี่ยนผ่านที่ไกลกว่า ("ไกล") เมื่อทำตามเงื่อนไข คำสั่งการเปลี่ยนแบบไม่มีเงื่อนไขจะถูกใช้เพิ่มเติม

    เวลาดำเนินการของคำสั่งกระโดดแบบมีเงื่อนไขแต่ละคำสั่งระบุไว้สำหรับสองกรณี: 1) ตรงตามเงื่อนไขและการควบคุมถูกโอนจริงตามออฟเซ็ต 2) เงื่อนไขไม่ตรงตามเงื่อนไข ดังนั้นการควบคุมจึงถูกถ่ายโอนไปยังคำสั่งถัดไป

    คำสั่งการจัดวงจรนำมาใช้ใน CPU เพื่อความสะดวกในการดำเนินการรอบการคำนวณ ซึ่งรวมถึงตัวช่วยจำต่อไปนี้: LOOP (วนซ้ำจนกว่า (CX) จะไม่เท่ากับ 0), LOOPNZ/LOOPNE (วนซ้ำจนถึงศูนย์/เท่ากัน), LOOPZ/LOOPE (วนซ้ำจนกระทั่งเป็นศูนย์/เท่ากับ) และ JCXZ (ข้ามไปที่ศูนย์ใน SH) . แต่ละคำสั่งเหล่านี้มีรูปแบบสองไบต์ ไบต์ที่สองระบุออฟเซ็ต 8 บิตที่ใช้ในการจัดเรียงการกระโดด ออฟเซ็ตนี้ถือเป็นตัวเลขที่เซ็นชื่อและเซ็นชื่อขยายเป็น 16 บิตก่อนที่จะคำนวณแอดเดรสข้าม

    การใช้คำสั่งวนซ้ำร่วมกับคำสั่งสำหรับจัดการกับองค์ประกอบสตริง คุณสามารถเขียนโปรแกรมแปลงสตริงที่ค่อนข้างซับซ้อนได้ พิจารณาตัวอย่างการเขียนโปรแกรมเพื่อแปลสตริงของข้อมูลที่เขียนในรูปแบบเลขฐานสิบหกเป็นรหัส ซึ่งตารางการค้นหาอยู่ในหน่วยความจำจากที่อยู่เริ่มต้นที่ระบุใน BX ตามที่จำเป็นเพื่อใช้คำสั่งแปลงตารางรหัส XLAT นอกจากนี้ ให้สตริงต้นทางมีองค์ประกอบ 80 รายการและอยู่ในหน่วยความจำจากที่อยู่เริ่มต้นสัมพัทธ์ 100 และควรวางสตริงผลลัพธ์จากที่อยู่สัมพัทธ์ 200 โปรแกรมที่เข้ารหัสสตริงต้นทางใหม่เป็นสตริงผลลัพธ์โดยมีค่าเป็น ธงทิศทาง DF=0 จะมีลักษณะดังนี้:

    MOV ศรี ,100
    MOV DI ,200
    มูฟ ซีเอ็กซ์, 80

    ที่นี่ ใช้คำสั่งตารางการแปลงรหัส XLAT ที่อธิบายใน 1.2

    คำสั่งขัดจังหวะรวม mnemocodes สามชุด: INT (ขัดจังหวะ), INTO (ขัดจังหวะเมื่อล้น) และ IRET (ส่งคืนจากการขัดจังหวะ)

    ขัดจังหวะคำสั่ง INT เมื่อ วี = 1มีรูปแบบสองไบต์ ไบต์ที่สองประกอบด้วยตัวเลข 8 บิตที่ระบุประเภท (พิมพ์)หรือระดับขัดจังหวะ. โดยคำสั่ง INT พิมพ์โปรเซสเซอร์ดำเนินการรูทีนบริการอินเตอร์รัปต์ตามระดับที่ระบุ ดำเนินการที่จำเป็นโดยอัตโนมัติเพื่อกลับไปยังเบรกพอยต์ การดำเนินการเหล่านี้มีดังต่อไปนี้: เนื้อหาของการลงทะเบียนแฟล็ก F ถูกเขียนไปยังสแต็ก (PUSHF), แฟล็ก IF และ TF จะถูกรีเซ็ต, ค่าปัจจุบันของการลงทะเบียน CS และตัวชี้คำสั่ง IP จะถูกเขียนลงในสแต็ก

    เพื่อกำหนดแอดเดรสเริ่มต้นของโปรแกรมการบำรุงรักษาตามค่า พิมพ์ใช้ตารางระดับขัดจังหวะ สำหรับแต่ละระดับการขัดจังหวะ 256 ระดับในตารางนี้มีการจัดสรรสี่ไบต์: สองไบต์แรกกำหนดค่าของตัวชี้คำสั่ง IP ที่สอง - ค่าของการลงทะเบียนเซ็กเมนต์ CS สี่ไบต์นี้กำหนดแอดเดรสเริ่มต้นของเซอร์วิสโปรแกรม (คู่ค่า CS, IP) ที่ต้องเขียนก่อนหน้านี้ไปยังเซลล์หน่วยความจำที่แอดเดรสสัมบูรณ์ 0-3FFH ที่อยู่ตารางตรงกับที่ระบุในคำสั่ง INT พิมพ์ระดับการขัดจังหวะกำหนดไว้ใน CPU ดังนี้ หลังจากจัดเก็บค่าปัจจุบันของ CS และ GR ในสแต็กแล้ว โหลดต่อไปนี้จะดำเนินการ: CS = พิมพ์ x 4 + 2 และ IP= พิมพ์ x 4. ค่า CS และ IP ใหม่นำมาตามลำดับจากเซลล์ที่มีที่อยู่ พิมพ์ x 4 + 2 และ พิมพ์ x 4, กำหนดที่อยู่เริ่มต้นของโปรแกรมบริการที่ต้องการ

    คำสั่งขัดจังหวะ INT ที่กล่าวถึงข้างต้นด้วยค่าของฟิลด์ วี = 0มีรูปแบบไบต์เดียว เช่น ไม่ต้องการระดับการขัดจังหวะพิเศษ คำสั่งนี้ได้รับการปฏิบัติโดยอัตโนมัติโดยโปรเซสเซอร์เป็นการขัดจังหวะระดับ 3 (แบบ=3)และนิยมใช้ในโปรแกรมเป็นจุดพัก

    คำสั่งขัดจังหวะ INTO โอเวอร์โฟลว์ทำให้เกิดการเปลี่ยนไปใช้บริการขัดจังหวะระดับ 4 (แบบ = 4)ในกรณีที่ค่าสถานะโอเวอร์โฟลว์ ของ = 1คำสั่ง INTO มักจะใช้หลังจากคำสั่งเลขคณิตที่มีเครื่องหมาย โดยปกติแล้ว ระดับการขัดจังหวะสองสามระดับแรก (สูงสุด 32) จะถูกสงวนไว้สำหรับจัดการกับสถานการณ์เฉพาะจำนวนหนึ่ง เช่น ความพยายามที่จะหารด้วยศูนย์ การโอเวอร์โฟลว์ และอื่นๆ ในทำนองเดียวกัน

    ความไม่ชอบมาพากลของการประมวลผลอินเตอร์รัปต์ของระดับที่สงวนไว้คือตัวประมวลผลจะสลับไปใช้บริการโดยไม่คำนึงถึงค่าของการอินเตอร์รัปต์ที่เปิดใช้งานแฟล็ก IF

    คำสั่ง IRET ไบต์เดี่ยวจะอยู่ที่ส่วนท้ายของรูทีนบริการอินเตอร์รัปต์แต่ละรายการ และให้ผลตอบแทนจากการอินเตอร์รัปต์ ด้วยคำสั่งนี้ โปรเซสเซอร์จะแสดงค่าของ IP ตัวชี้คำสั่งและโปรแกรมเซกเมนต์ CS จากสแต็ก และยังกู้คืนเนื้อหาก่อนหน้าของแฟล็กรีจิสเตอร์ F (เช่นเดียวกับคำสั่ง POPF) หากจำเป็น เนื้อหาของรีจิสเตอร์ที่เหลือของ CPU ซึ่งสอดคล้องกับโปรแกรมที่ถูกขัดจังหวะ สามารถจัดเก็บไว้ในสแต็กเมื่อเปลี่ยนเป็นเซอร์วิสโปรแกรม และกู้คืนเมื่อกลับมาโดยใช้คำแนะนำการเข้าถึงสแต็ก

    สารสนเทศและเทคโนโลยีสารสนเทศ: บันทึกการบรรยายโดย Tsvetkov A. V

    2. ควบคุมคำสั่งถ่ายโอน

    เราได้ทำความคุ้นเคยกับบางทีมที่ฟอร์ม เชิงเส้นส่วนต่างๆ ของโปรแกรม โดยทั่วไปแล้วแต่ละรายการจะทำการแปลงหรือถ่ายโอนข้อมูล หลังจากนั้นไมโครโปรเซสเซอร์จะถ่ายโอนการควบคุมไปยังคำสั่งถัดไป แต่มีโปรแกรมน้อยมากที่ทำงานในลักษณะที่สอดคล้องกัน มักจะมีจุดในโปรแกรมที่ต้องตัดสินใจเกี่ยวกับคำสั่งที่จะดำเนินการต่อไป วิธีแก้ปัญหานี้อาจเป็น:

    1) ไม่มีเงื่อนไข -ณ จุดนี้จำเป็นต้องถ่ายโอนการควบคุมไม่ใช่คำสั่งถัดไป แต่ไปยังคำสั่งอื่นซึ่งอยู่ห่างจากคำสั่งปัจจุบัน

    2) เงื่อนไข -การตัดสินใจเกี่ยวกับคำสั่งที่จะดำเนินการต่อไปนั้นขึ้นอยู่กับการวิเคราะห์เงื่อนไขหรือข้อมูลบางอย่าง

    โปรแกรมคือลำดับของคำสั่งและข้อมูลที่ใช้พื้นที่ RAM จำนวนหนึ่ง พื้นที่หน่วยความจำนี้สามารถอยู่ติดกันหรือประกอบด้วยหลายส่วน

    คำสั่งโปรแกรมใดที่ควรดำเนินการต่อไป ไมโครโปรเซสเซอร์จะเรียนรู้จากเนื้อหาของรีจิสเตอร์คู่หนึ่ง cs:(จ)ip:

    1) cs – การลงทะเบียนส่วนของรหัสซึ่งมีที่อยู่จริง (ฐาน) ของส่วนรหัสปัจจุบัน

    2) eip/ip - รีจิสเตอร์พอยน์เตอร์คำสั่งซึ่งมีค่าแทนออฟเซ็ตในหน่วยความจำของคำสั่งถัดไปที่จะดำเนินการเมื่อเทียบกับจุดเริ่มต้นของส่วนรหัสปัจจุบัน

    จะใช้รีจิสเตอร์ใดขึ้นอยู่กับโหมดการกำหนดแอดเดรสที่ตั้งไว้ use16 หรือ use32 ถ้าระบุ use 16 ก็จะใช้ ip ถ้า use32 ก็จะใช้ eip

    ดังนั้นคำสั่งการถ่ายโอนการควบคุมจึงเปลี่ยนเนื้อหาของการลงทะเบียน cs และ eip / ip อันเป็นผลมาจากการที่ไมโครโปรเซสเซอร์เลือกสำหรับการดำเนินการไม่ใช่คำสั่งโปรแกรมถัดไปตามลำดับ แต่เป็นคำสั่งในส่วนอื่น ๆ ของโปรแกรม ไปป์ไลน์ภายในไมโครโปรเซสเซอร์ถูกรีเซ็ต

    ตามหลักการของการทำงาน คำสั่งไมโครโปรเซสเซอร์ที่ให้องค์กรของการเปลี่ยนแปลงในโปรแกรมสามารถแบ่งออกเป็น 3 กลุ่ม:

    1. การถ่ายโอนคำสั่งควบคุมแบบไม่มีเงื่อนไข:

    1) คำสั่งสาขาที่ไม่มีเงื่อนไข

    2) คำสั่งเรียกโพรซีเดอร์และส่งคืนจากโพรซีเดอร์

    3) คำสั่งเรียกการขัดจังหวะของซอฟต์แวร์และส่งคืนจากการขัดจังหวะของซอฟต์แวร์

    2. คำสั่งสำหรับการถ่ายโอนการควบคุมแบบมีเงื่อนไข:

    1) คำสั่งกระโดดตามผลลัพธ์ของคำสั่งเปรียบเทียบ p;

    2) คำสั่งการเปลี่ยนแปลงตามสถานะของการตั้งค่าสถานะบางอย่าง

    3) คำแนะนำสำหรับการกระโดดผ่านเนื้อหาของการลงทะเบียน esx/cx

    3. คำสั่งควบคุมวงจร:

    1) คำสั่งสำหรับจัดวงจรด้วยตัวนับ ехх / сх;

    2) คำสั่งสำหรับจัดระเบียบวงจรด้วยตัวนับ ех/сх โดยมีความเป็นไปได้ที่จะออกจากวงจรก่อนกำหนดโดยมีเงื่อนไขเพิ่มเติม

    การกระโดดแบบไม่มีเงื่อนไข

    การอภิปรายก่อนหน้านี้ได้เปิดเผยรายละเอียดบางประการของกลไกการเปลี่ยนแปลง คำสั่งข้ามแก้ไขรีจิสเตอร์ตัวชี้คำสั่ง eip/ip และอาจเป็นรีจิสเตอร์โค้ด cs สิ่งที่จำเป็นต้องแก้ไขขึ้นอยู่กับ:

    1) ประเภทของตัวถูกดำเนินการในคำสั่งสาขาที่ไม่มีเงื่อนไข (ใกล้หรือไกล)

    2) จากตัวบ่งชี้ก่อนที่อยู่การข้าม (ในคำสั่งการกระโดด) ตัวดัดแปลง;ในกรณีนี้ ที่อยู่ข้ามสามารถอยู่ในคำสั่งโดยตรง (ข้ามโดยตรง) หรือในรีจิสเตอร์หรือเซลล์หน่วยความจำ (กระโดดทางอ้อม)

    ตัวดัดแปลงสามารถรับค่าต่อไปนี้:

    1) ใกล้ ptr - การเปลี่ยนโดยตรงไปยังป้ายกำกับภายในส่วนรหัสปัจจุบัน เฉพาะการลงทะเบียน eip/ip เท่านั้นที่แก้ไข (ขึ้นอยู่กับประเภทเซ็กเมนต์รหัส use16 หรือ use32 ที่ระบุ) ตามที่อยู่ (ป้ายกำกับ) ที่ระบุในคำสั่งหรือนิพจน์โดยใช้สัญลักษณ์การแยกค่า - $;

    2) far ptr - การเปลี่ยนโดยตรงไปยังป้ายกำกับในส่วนรหัสอื่น ที่อยู่ข้ามถูกระบุเป็นตัวถูกดำเนินการทันทีหรือที่อยู่ (ฉลาก) และประกอบด้วยตัวเลือก 16 บิตและออฟเซ็ต 16/32 บิต ซึ่งโหลดลงในการลงทะเบียน cs และ ip/eip ตามลำดับ

    3) word ptr - การเปลี่ยนทางอ้อมไปยังป้ายกำกับภายในส่วนรหัสปัจจุบัน เฉพาะ eip/ip เท่านั้นที่ถูกแก้ไข (โดยค่าออฟเซ็ตจากหน่วยความจำที่แอดเดรสที่ระบุในคำสั่ง หรือจากรีจิสเตอร์) ขนาดออฟเซ็ต 16 หรือ 32 บิต;

    4) dword ptr - การเปลี่ยนทางอ้อมไปยังป้ายกำกับในส่วนรหัสอื่น การลงทะเบียนทั้งสองได้รับการแก้ไข (ด้วยค่าจากหน่วยความจำ - และจากหน่วยความจำเท่านั้นจากการลงทะเบียน) - cs และ eip / ip คำ/dword แรกของที่อยู่นี้แสดงถึง offset และถูกโหลดลงใน ip/eip; คำที่สอง/สามถูกโหลดลงใน cs jmp คำสั่งกระโดดแบบไม่มีเงื่อนไข

    ไวยากรณ์คำสั่งสำหรับสาขาที่ไม่มีเงื่อนไขคือ jmp [ตัวดัดแปลง] jump_address - สาขาที่ไม่มีเงื่อนไขโดยไม่บันทึกข้อมูลเกี่ยวกับจุดส่งคืน

    Jump_address คือที่อยู่ในรูปแบบของป้ายกำกับหรือที่อยู่ของพื้นที่หน่วยความจำซึ่งมีตัวชี้กระโดดอยู่

    โดยรวมแล้ว ในระบบคำสั่งไมโครโปรเซสเซอร์มีรหัสคำสั่งเครื่องหลายรหัสสำหรับ Jump JMP แบบไม่มีเงื่อนไข

    ความแตกต่างถูกกำหนดโดยระยะเปลี่ยนผ่านและวิธีการระบุที่อยู่เป้าหมาย พิสัยการเปลี่ยนแปลงถูกกำหนดโดยตำแหน่งของตัวถูกดำเนินการ กระโดด_ที่อยู่ที่อยู่นี้อาจอยู่ในส่วนรหัสปัจจุบันหรือในส่วนอื่น ในกรณีแรกเรียกว่าการเปลี่ยนแปลง การแบ่งส่วน,หรือ ปิด,ในวินาที - อินเตอร์เซกเมนต์,หรือ ห่างไกลการข้ามภายในเซกเมนต์จะถือว่าเฉพาะเนื้อหาของการลงทะเบียน eip/ip เท่านั้นที่เปลี่ยนแปลง

    มีสามตัวเลือกสำหรับการใช้คำสั่ง jmp ภายในเซ็กเมนต์:

    1) สั้นตรง

    2) ตรง;

    3) ทางอ้อม

    ขั้นตอน

    ภาษาแอสเซมบลีมีเครื่องมือหลายอย่างที่ช่วยแก้ปัญหาการทำซ้ำส่วนของโค้ด เหล่านี้รวมถึง:

    1) กลไกของขั้นตอน;

    2) แอสเซมเบลอร์มาโคร;

    3) กลไกการขัดจังหวะ

    ขั้นตอนที่มักเรียกกันว่า รูทีนย่อยเป็นหน่วยการทำงานพื้นฐานของการสลายตัว (แบ่งออกเป็นหลายส่วน) ของงานบางอย่าง โพรซีเดอร์คือกลุ่มของคำสั่งสำหรับแก้ไขงานย่อยเฉพาะ และมีวิธีการรับการควบคุมจากจุดที่เรียกงานในระดับที่สูงกว่าและส่งคืนการควบคุมไปยังจุดนี้

    ในกรณีที่ง่ายที่สุด โปรแกรมอาจประกอบด้วยขั้นตอนเดียว กล่าวอีกนัยหนึ่ง โพรซีเดอร์สามารถกำหนดเป็นชุดคำสั่งที่มีรูปแบบเหมาะสม ซึ่งอธิบายเพียงครั้งเดียว สามารถเรียกใช้ได้ทุกที่ในโปรแกรมหากจำเป็น

    เพื่ออธิบายลำดับของคำสั่งเป็นขั้นตอนในภาษาแอสเซมบลี จะใช้คำสั่งสองคำสั่ง: PROC และ ENDP

    ไวยากรณ์คำอธิบายขั้นตอนมีดังนี้ (รูปที่ 36)

    ข้าว. 36. ไวยากรณ์ของคำอธิบายขั้นตอนในโปรแกรม

    รูปที่ 36 แสดงให้เห็นว่าในส่วนหัวของขั้นตอน (คำสั่ง PROC) เฉพาะชื่อขั้นตอนเท่านั้นที่บังคับ ในบรรดาตัวดำเนินการจำนวนมากของคำสั่ง PROC ควรเน้น [ระยะทาง] แอตทริบิวต์นี้สามารถรับค่าใกล้หรือไกลและระบุความเป็นไปได้ในการเรียกขั้นตอนจากส่วนรหัสอื่น ตามค่าเริ่มต้น แอตทริบิวต์ [ระยะทาง] จะถูกตั้งค่าให้ใกล้

    ขั้นตอนสามารถวางไว้ที่ใดก็ได้ในโปรแกรม แต่ในลักษณะที่ไม่ได้รับการควบคุมแบบสุ่ม หากขั้นตอนถูกแทรกเข้าไปในสตรีมคำสั่งทั่วไป ไมโครโปรเซสเซอร์จะรับรู้คำแนะนำของขั้นตอนโดยเป็นส่วนหนึ่งของสตรีมนี้ และตามนั้น จะดำเนินการตามคำแนะนำของขั้นตอน

    การกระโดดแบบมีเงื่อนไข

    ไมโครโปรเซสเซอร์มี 18 คำสั่งกระโดดแบบมีเงื่อนไข คำสั่งเหล่านี้ช่วยให้คุณตรวจสอบ:

    1) ความสัมพันธ์ระหว่างตัวถูกดำเนินการกับเครื่องหมาย (“มาก - น้อย”);

    2) ความสัมพันธ์ระหว่างตัวถูกดำเนินการโดยไม่มีเครื่องหมาย ("สูงกว่า - ต่ำกว่า");

    3) สถานะของธงเลขคณิต ZF, SF, CF, OF, PF (แต่ไม่ใช่ AF)

    คำสั่งกระโดดแบบมีเงื่อนไขมีไวยากรณ์เหมือนกัน:

    jcc jump_label

    อย่างที่คุณเห็นรหัสช่วยจำของคำสั่งทั้งหมดเริ่มต้นด้วย "j" - จากคำ กระโดด(เด้ง), ของเธอ -ระบุเงื่อนไขเฉพาะที่จะแยกวิเคราะห์โดยคำสั่ง

    เกี่ยวกับตัวดำเนินการ Jump_label,จากนั้นป้ายกำกับนี้สามารถอยู่ในส่วนรหัสปัจจุบันเท่านั้น ไม่อนุญาตให้ถ่ายโอนการควบคุมระหว่างส่วนในการกระโดดแบบมีเงื่อนไข ในเรื่องนี้ ไม่มีคำถามเกี่ยวกับตัวดัดแปลง ซึ่งมีอยู่ในไวยากรณ์ของคำสั่งกระโดดแบบไม่มีเงื่อนไข ในไมโครโปรเซสเซอร์รุ่นแรกๆ (i8086, i80186 และ i80286) คำสั่งสาขาแบบมีเงื่อนไขสามารถข้ามสั้นๆ ได้เท่านั้น จาก -128 ถึง +127 ไบต์จากคำสั่งตามคำสั่งสาขาแบบมีเงื่อนไข เริ่มต้นด้วยไมโครโปรเซสเซอร์รุ่น 80386 ข้อจำกัดนี้จะถูกลบออก แต่อย่างที่คุณเห็น เฉพาะในส่วนโค้ดปัจจุบันเท่านั้น

    ในการตัดสินใจว่าการควบคุมจะถูกโอนไปยังคำสั่ง Jump แบบมีเงื่อนไข จะต้องสร้างเงื่อนไขขึ้นก่อน โดยพิจารณาจากการตัดสินใจโอนการควบคุม

    แหล่งที่มาของเงื่อนไขดังกล่าวสามารถ:

    1) คำสั่งใด ๆ ที่เปลี่ยนสถานะของธงเลขคณิต

    2) คำสั่งเปรียบเทียบ p ซึ่งเปรียบเทียบค่าของตัวถูกดำเนินการสองตัว

    3) สถานะของการลงทะเบียน esx/cx

    คำสั่งเปรียบเทียบ cmp

    คำสั่งเปรียบเทียบหน้ามีวิธีการทำงานที่น่าสนใจ มันเหมือนกับคำสั่งการลบทุกประการ - ตัวถูกดำเนินการย่อย, ตัวถูกดำเนินการ_2

    คำสั่ง p เช่นคำสั่งย่อย ลบตัวถูกดำเนินการและตั้งค่าสถานะ สิ่งเดียวที่ไม่ทำคือเขียนผลลัพธ์ของการลบแทนตัวถูกดำเนินการตัวแรก

    ไวยากรณ์ของคำสั่ง str - stroperand_1,operand_2 (เปรียบเทียบ) - เปรียบเทียบตัวถูกดำเนินการสองตัวและตั้งค่าสถานะตามผลลัพธ์ของการเปรียบเทียบ

    แฟล็กที่ตั้งค่าโดยคำสั่ง p สามารถวิเคราะห์ได้โดยคำสั่งแบรนช์แบบมีเงื่อนไขพิเศษ ก่อนที่เราจะดูพวกเขา เรามาใส่ใจกันสักนิดเกี่ยวกับตัวช่วยจำของคำสั่งกระโดดแบบมีเงื่อนไขเหล่านี้ (ตารางที่ 16) การทำความเข้าใจสัญกรณ์เมื่อสร้างชื่อของคำสั่งข้ามแบบมีเงื่อนไข (องค์ประกอบในชื่อของคำสั่ง jcc เรากำหนดไว้) จะอำนวยความสะดวกในการท่องจำและการใช้งานจริงเพิ่มเติม

    ตารางที่ 16. ความหมายของตัวย่อในชื่อคำสั่ง jcc

    ตารางที่ 17. รายการคำสั่งสาขาแบบมีเงื่อนไขสำหรับคำสั่ง str ตัวถูกดำเนินการ_1, ตัวถูกดำเนินการ_2

    อย่าแปลกใจกับข้อเท็จจริงที่ว่ารหัสช่วยจำที่แตกต่างกันหลายคำสั่งของเงื่อนไขสาขาสอดคล้องกับค่าสถานะเดียวกัน (พวกมันถูกแยกออกจากกันด้วยเครื่องหมายทับในตารางที่ 17) ความแตกต่างในชื่อนี้เกิดจากความต้องการของนักพัฒนาไมโครโปรเซสเซอร์ที่ต้องการทำให้ง่ายต่อการใช้คำสั่งกระโดดแบบมีเงื่อนไขร่วมกับคำสั่งบางกลุ่ม ดังนั้นชื่อที่แตกต่างกันจึงสะท้อนถึงการวางแนวการทำงานที่แตกต่างกัน อย่างไรก็ตามความจริงที่ว่าคำสั่งเหล่านี้ตอบสนองต่อแฟล็กเดียวกันทำให้เทียบเท่าและเท่าเทียมกันในโปรแกรม ดังนั้นในตารางที่ 17 จึงไม่จัดกลุ่มตามชื่อ แต่ตามค่าของแฟล็ก (เงื่อนไข) ที่พวกเขาตอบสนอง

    คำสั่งสาขาแบบมีเงื่อนไขและค่าสถานะ

    การกำหนดระบบช่วยจำของคำสั่งกระโดดแบบมีเงื่อนไขบางอย่างสะท้อนถึงชื่อของแฟล็กที่ใช้งาน และมีโครงสร้างดังต่อไปนี้: อักขระ "j" มาก่อน (กระโดด,การเปลี่ยนแปลง) ส่วนที่สองคือการกำหนดแฟล็กหรือสัญลักษณ์ปฏิเสธ "n" ตามด้วยชื่อของแฟล็ก โครงสร้างทีมนี้สะท้อนถึงจุดประสงค์ หากไม่มีอักขระ "n" สถานะของแฟล็กจะถูกตรวจสอบ หากมีค่าเท่ากับ 1 จะมีการเปลี่ยนไปใช้เลเบลกระโดด หากมีสัญลักษณ์ "n" สถานะของแฟล็กจะถูกตรวจสอบความเท่าเทียมกันเป็น 0 และหากสำเร็จ จะมีการข้ามไปที่ป้ายกำกับการกระโดด

    ตัวช่วยจำคำสั่ง ชื่อแฟล็ก และเงื่อนไขการกระโดดแสดงในตารางที่ 18 คำสั่งเหล่านี้สามารถใช้ต่อจากคำสั่งใดๆ ที่ปรับเปลี่ยนแฟล็กที่ระบุ

    ตารางที่ 18. คำสั่งกระโดดแบบมีเงื่อนไขและค่าสถานะ

    หากคุณดูตารางที่ 17 และ 18 อย่างใกล้ชิด คุณจะเห็นว่าคำสั่งกระโดดแบบมีเงื่อนไขจำนวนมากในนั้นเทียบเท่ากัน เนื่องจากทั้งสองคำสั่งอิงตามการวิเคราะห์ของแฟล็กเดียวกัน

    คำแนะนำการข้ามแบบมีเงื่อนไขและการลงทะเบียน esx/cx

    สถาปัตยกรรมของไมโครโปรเซสเซอร์เกี่ยวข้องกับการใช้งานเฉพาะของการลงทะเบียนจำนวนมาก ตัวอย่างเช่น ใช้รีจิสเตอร์ EAX / AX / AL เป็นแอคคูมูเลเตอร์ และใช้รีจิสเตอร์ BP, SP เพื่อทำงานกับสแต็ก การลงทะเบียน ECX / CX ยังมีวัตถุประสงค์การทำงานบางอย่าง: ดำเนินการตามบทบาท เคาน์เตอร์ในคำสั่งควบคุมลูปและเมื่อทำงานกับสตริงอักขระ เป็นไปได้ที่คำสั่งสาขาแบบมีเงื่อนไขที่เกี่ยวข้องกับการลงทะเบียน esx/cx จะถูกระบุอย่างถูกต้องมากกว่าจากกลุ่มคำสั่งนี้

    ไวยากรณ์สำหรับคำสั่งสาขาเงื่อนไขนี้คือ:

    1) jcxz jump_label (กระโดดถ้า ex เป็นศูนย์) – กระโดดถ้า сх เป็นศูนย์

    2) jecxz jump_label (กระโดดเท่ากับ ех ศูนย์) – กระโดดถ้า ех เป็นศูนย์

    คำสั่งเหล่านี้มีประโยชน์มากเมื่อวนซ้ำและเมื่อทำงานกับสตริงอักขระ

    ควรสังเกตว่ามีข้อจำกัดในคำสั่ง jcxz/jecxz ไม่เหมือนกับคำสั่งการถ่ายโอนแบบมีเงื่อนไขอื่นๆ คำสั่ง jcxz/jecxz สามารถระบุการกระโดดแบบสั้น -128 ไบต์หรือ +127 ไบต์จากคำสั่งที่ตามมา

    องค์กรของวัฏจักร

    อย่างที่คุณทราบวัฏจักรเป็นโครงสร้างอัลกอริทึมที่สำคัญโดยที่ไม่มีการใช้งานซึ่งอาจไม่มีโปรแกรมใดสามารถทำได้ คุณสามารถจัดระเบียบการดำเนินการแบบวนซ้ำของส่วนใดส่วนหนึ่งของโปรแกรมได้ ตัวอย่างเช่น การใช้การถ่ายโอนคำสั่งควบคุมแบบมีเงื่อนไขหรือคำสั่ง jmp แบบไม่มีเงื่อนไข ด้วยการจัดวงจรดังกล่าว การดำเนินการทั้งหมดสำหรับองค์กรจะดำเนินการด้วยตนเอง แต่เนื่องจากความสำคัญขององค์ประกอบอัลกอริทึมดังกล่าวเป็นวัฏจักร ผู้พัฒนาไมโครโปรเซสเซอร์จึงแนะนำกลุ่มคำสั่งสามคำสั่งในระบบคำสั่ง ซึ่งอำนวยความสะดวกในการเขียนโปรแกรมของวัฏจักร คำสั่งเหล่านี้ยังใช้รีจิสเตอร์ esx/cx เป็น ตัวนับรอบ

    ให้คำอธิบายสั้น ๆ ของคำสั่งเหล่านี้: 1) loop jump_label (Loop) - ทำซ้ำลูป คำสั่งอนุญาตให้คุณจัดระเบียบการวนซ้ำคล้ายกับการวนซ้ำในภาษาระดับสูงพร้อมการลดตัวนับการวนซ้ำโดยอัตโนมัติ หน้าที่ของทีมคือการดำเนินการต่อไปนี้:

    b) เปรียบเทียบรีจิสเตอร์ ECX/CX กับศูนย์: ถ้า (ECX/CX) = 0 การควบคุมจะถูกถ่ายโอนไปยังคำสั่งถัดไปหลังจากลูป

    2) loope/loopz jump_label

    คำสั่ง loope และ loopz เป็นคำพ้องความหมายเดียวกัน การทำงานของคำสั่งคือการดำเนินการต่อไปนี้:

    ก) การลดลงของการลงทะเบียน ECX/CX;

    c) การวิเคราะห์สถานะของแฟล็กศูนย์ ZF ถ้า (ECX/CX) = 0 หรือ XF = 0 การควบคุมจะถูกถ่ายโอนไปยังคำสั่งถัดไปหลังจากลูป

    3) loopne/loopnz jump_label

    คำสั่ง loopne และ loopnz เป็นคำพ้องความหมายเดียวกัน การทำงานของคำสั่งคือการดำเนินการต่อไปนี้:

    ก) การลดลงของการลงทะเบียน ECX/CX;

    b) เปรียบเทียบการลงทะเบียน ECX/CX กับศูนย์;

    c) การวิเคราะห์สถานะของแฟล็กศูนย์ ZF: ถ้า (ECX/CX) = 0 หรือ ZF = 1 การควบคุมจะถูกถ่ายโอนไปยังคำสั่งถัดไปหลังจากลูป

    คำสั่ง loope/loopz และ loopne/loopnz นั้นกลับกันในการดำเนินการ พวกเขาขยายการดำเนินการของคำสั่งลูปโดยแยกวิเคราะห์แฟล็ก zf เพิ่มเติม ซึ่งทำให้สามารถจัดระเบียบการออกจากลูปก่อนกำหนดได้ โดยใช้แฟล็กนี้เป็นตัวบ่งชี้

    ข้อเสียของคำสั่งวนซ้ำ loop, loope/loopz และ loopne/loopnz คือใช้เฉพาะการกระโดดสั้นๆ (-128 ถึง +127 ไบต์) ในการทำงานกับลูปแบบยาว คุณจะต้องใช้การกระโดดแบบมีเงื่อนไขและคำสั่ง jmp ดังนั้นพยายามทำให้เชี่ยวชาญทั้งสองวิธีในการจัดระเบียบลูป

    จากหนังสือซอฟต์แวร์ของระบบฝังตัว ข้อกำหนดทั่วไปสำหรับการพัฒนาและการจัดทำเอกสาร ผู้เขียน Gosstandart ของรัสเซีย

    จากหนังสือ Linux สำหรับผู้ใช้ ผู้เขียน Kostromin Viktor Alekseevich

    จากหนังสือวิทยาการคอมพิวเตอร์และเทคโนโลยีสารสนเทศ: เอกสารประกอบการบรรยาย ผู้เขียน Tsvetkov A.V

    LECTURE No. 19. ควบคุมคำสั่งถ่ายโอน

    จากหนังสือ 200 โปรแกรมที่ดีที่สุดสำหรับอินเทอร์เน็ต กวดวิชายอดนิยม ผู้เขียน Krainsky I

    2. Control Transfer Commands เราได้ทำความคุ้นเคยกับคำสั่งบางคำสั่งที่สร้างส่วนเชิงเส้นของโปรแกรม โดยทั่วไปแล้วแต่ละรายการจะดำเนินการบางอย่างเพื่อแปลงหรือถ่ายโอนข้อมูล หลังจากนั้นไมโครโปรเซสเซอร์จะถ่ายโอนการควบคุม

    จากหนังสือ Windows Vista โดยไม่เครียด ผู้เขียน

    วิธีการส่ง มีสองวิธีในการสตรีมวิดีโอคือ Progressive Streaming และ Real-Time Streaming ในการส่งแบบอนุกรมคุณภาพของภาพจะดีกว่าเสมอเนื่องจากเล่นวิดีโอจากฮาร์ดดิสก์

    จากหนังสือ DIY Linux Server ผู้เขียน

    ปัญหาการส่ง เมื่อสตรีมวิดีโอผ่านอินเทอร์เน็ต อาจเกิดปัญหาที่ทำให้คุณภาพการส่งลดลง ในหมู่พวกเขา มีหลายหลัก การขัดจังหวะในการสื่อสารการออกอากาศแบบสตรีมมิ่งต้องใช้การเชื่อมต่อที่เสถียร เนื่องจากอินเตอร์เน็ตไม่สามารถให้บริการได้

    จากหนังสือ TCP/IP Architecture, Protocols, Implementation (รวมถึง IP เวอร์ชัน 6 และ IP Security) ผู้เขียน Faith Sidney M

    8.1. แผงควบคุมจำเป็นสำหรับการควบคุมในอุปกรณ์ที่ซับซ้อนใด ๆ มักจะมีรีโมตคอนโทรล - ชุดปุ่ม, คันโยก, เซ็นเซอร์สัมผัส, พวงมาลัย ... ในคำเดียวคืออุปกรณ์ที่คุณสามารถควบคุมอุปกรณ์ที่ซับซ้อนนี้ได้ มีเช่น "การควบคุมระยะไกล" ใน Vista มันถูกเรียกว่า

    จากหนังสือ OrCAD PSpice การวิเคราะห์วงจรไฟฟ้า โดย Keown J.

    5.3. คำสั่งควบคุมกระบวนการ คำสั่ง ps คำสั่ง ps ใช้เพื่อแสดงข้อมูลเกี่ยวกับกระบวนการที่กำลังทำงานอยู่ คำสั่งนี้มีหลายตัวเลือก ซึ่งคุณสามารถอ่านได้ในคู่มือ (man ps) ที่นี่ฉันจะอธิบายเฉพาะที่ใช้บ่อยที่สุด

    จากหนังสือ Linux: The Complete Guide ผู้เขียน Kolisnichenko เดนิส นิโคลาเยวิช

    10.4. คำสั่งการจัดการเซิร์ฟเวอร์ DNS โปรแกรม ndc ใช้เพื่อจัดการเซิร์ฟเวอร์ DNS สามารถใช้กับพารามิเตอร์ start, stop, reload, restart พารามิเตอร์ start สตาร์ทเซิร์ฟเวอร์ และ stop หยุดการทำงาน ตัวเลือกการโหลดซ้ำจะโหลดไฟล์โซนซ้ำหากมีการเปลี่ยนแปลง และ

    จากหนังสือ PC โดยไม่ต้องเครียด ผู้เขียน Zhvalevsky อันเดรย์ วาเลนติโนวิช

    14.6.1 คำสั่งควบคุมการเข้าถึงคำสั่งและพารามิเตอร์ที่กำหนดการเข้าถึงของผู้ใช้ไปยังที่เก็บไฟล์ของโฮสต์ระยะไกลถูกกำหนดไว้ในตาราง 14.1 ตาราง 14.1 คำสั่งการให้สิทธิ์ผู้ใช้สำหรับการเข้าถึงแบบเก็บถาวร

    จากหนังสือ The Art of Shell Scripting Programming โดยคูเปอร์ เมนเดล

    14.6.2 คำสั่งการจัดการไฟล์ คำสั่งในตาราง 14.2 ช่วยให้คุณสามารถดำเนินการจัดตำแหน่งไดเร็กทอรีและจัดการไฟล์บนรีโมตโฮสต์ได้ ไดเร็กทอรีการทำงานคือไดเร็กทอรีปัจจุบันของผู้ใช้ ตาราง 14.2 คำสั่งการเลือก

    จากหนังสือของผู้แต่ง

    สายส่ง แม้ว่า PSpice จะมีอุปกรณ์พิเศษที่เรียกว่า T (สำหรับสายส่ง) แต่การใช้งานก็มีจำกัด เนื่องจากรุ่นนี้ไม่คำนึงถึงการสูญเสียสาย เรานิยมใช้แบบจำลองสำหรับสายส่งที่คำนึงถึงการสูญเสียและมีองค์ประกอบของ R

    จากหนังสือของผู้แต่ง

    9.2. คำสั่งควบคุมกระบวนการ 9.2.1 ลำดับชั้นของกระบวนการ: ps และ pstree คุณรู้อยู่แล้วว่าคำสั่ง ps อนุญาตให้คุณดูข้อมูลเกี่ยวกับกระบวนการทั้งหมดที่ทำงานอยู่ในระบบในขณะนี้ (หัวข้อ 3.2) ด้วยตัวเลือก -f คำสั่งนี้จะพิมพ์ทั้ง PID ของกระบวนการเองและ PPID ของพาเรนต์

    จากหนังสือของผู้แต่ง

    แผงควบคุมจำเป็นสำหรับการควบคุมในอุปกรณ์ที่ซับซ้อนใด ๆ มักจะมีรีโมตคอนโทรล - ชุดปุ่ม, คันโยก, เซ็นเซอร์สัมผัส, พวงมาลัย ... ในคำเดียวคืออุปกรณ์ที่คุณสามารถควบคุมอุปกรณ์ที่ซับซ้อนนี้ได้ มีเช่น "การควบคุมระยะไกล" ใน Vista มันถูกเรียกว่า

    จากหนังสือของผู้แต่ง

    11.1. คำสั่งควบคุมงาน คำสั่งบางส่วนต่อไปนี้ใช้ "รหัสงาน" เป็นอาร์กิวเมนต์ ดูตารางที่ส่วนท้ายของบท งาน แสดงรายการงานที่ทำงานอยู่เบื้องหลัง คำสั่ง ps เป็นข้อมูลมากกว่า งานและกระบวนการสับสนได้ง่าย

    จากหนังสือของผู้แต่ง

    12.7. คำสั่งควบคุมเทอร์มินัล คำสั่งที่เกี่ยวข้องกับคอนโซลหรือเทอร์มินัล ทำให้เริ่มต้นเทอร์มินัลหรือค้นหาฐานข้อมูลเทอร์มินัล terminfo คุณสามารถดำเนินการต่าง ๆ ด้วย tput tput clear เทียบเท่ากับคำสั่ง clear รีเซ็ต tput - เทียบเท่า



    ชอบบทความ? แบ่งปันกับเพื่อน ๆ !
    บทความนี้เป็นประโยชน์หรือไม่?
    ใช่
    เลขที่
    ขอบคุณสำหรับความคิดเห็นของคุณ!
    เกิดข้อผิดพลาดและระบบไม่นับคะแนนของคุณ
    ขอบคุณ ข้อความของคุณถูกส่งแล้ว
    คุณพบข้อผิดพลาดในข้อความหรือไม่?
    เลือกคลิก Ctrl+Enterและเราจะแก้ไขมัน!