กลับไปหน้าบทความ

อ่าน 3 นาที

ลงทะเบียน FLAGS

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

ลงทะเบียน FLAGS

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

แฟล็กตัวทด (carry), แฟล็กพาริตี (parity), แฟล็กตัวทดเสริม (หรือแฟล็กตัวทดครึ่งตัว), แฟล็กศูนย์ (zero) และแฟล็กเครื่องหมาย (sign) มีอยู่ในสถาปัตยกรรมหลายแบบ (สถาปัตยกรรม RISC สมัยใหม่หลายแบบไม่มีแฟล็ก เช่น แฟล็กตัวทด และถึงแม้จะมีแฟล็ก แฟล็กตัวทดครึ่งตัวก็หายาก เนื่องจากคณิตศาสตร์ BCD ไม่เป็นที่นิยมอีกต่อไป และยังมีการรองรับที่จำกัดในโหมด longบนx86-64ด้วย)

ใน โปรเซสเซอร์ Intel 8086รีจิสเตอร์นี้มี ความกว้าง 16 บิต ส่วนรีจิสเตอร์รุ่น ต่อมาคือEFLAGSและRFLAGS (ในสถาปัตยกรรมx86-64 รุ่นใหม่ ) มี ความกว้าง 32 บิตและ64 บิตตามลำดับ รีจิสเตอร์ที่มีความกว้างมากขึ้นยังคงรักษาความเข้ากันได้กับรีจิสเตอร์รุ่นก่อนหน้าที่มีขนาดเล็กกว่า

ธง

รีจิสเตอร์ Intel x86 FLAGS [ 1 ]
นิดหน่อย #หน้ากากคำย่อคำอธิบายหมวดหมู่=1=0
ธง
00x0001ซีเอฟถือธงสถานะCY (แบก)NC (ห้ามพกพา)
10x0002บีอาร์กีI/O Trap ( เฉพาะ NEC V25 /V35/V55 เท่านั้น) [ 2 ]สงวนไว้และมีค่าเป็น 1 เสมอในEFLAGSบนโปรเซสเซอร์ x86 อื่นๆ ทั้งหมด[ 3 ] [ 4 ]ควบคุม(เฉพาะ NEC) อนุญาตให้ใช้งาน I/O ได้(เฉพาะ NEC) I/O ติดค้าง
20x0004พีเอฟธงความเท่าเทียมกันสถานะPE (Parity Even)PO (Parity Odd)
30x0008สงวนไว้[ 4 ]
40x0010เอเอฟธงแบกเสริม[ 5 ]สถานะAC (อุปกรณ์ช่วยพกพา)NA (ห้ามพกพาสัมภาระเสริม)
50x0020สงวนไว้[ 4 ]
60x0040ซีเอฟธงศูนย์สถานะZR (ศูนย์)NZ (ไม่ใช่ศูนย์)
70x0080เอสเอฟป้ายธงสถานะNG (ลบ)PL (บวก)
80x0100ทีเอฟธงดัก (ขั้นตอนเดียว)ควบคุม
90x0200ถ้าแฟล็กเปิดใช้งานการขัดจังหวะควบคุมEI (เปิดใช้งานการขัดจังหวะ)DI (ปิดใช้งานการขัดจังหวะ)
100x0400ดีเอฟธงบอกทิศทางควบคุมDN (ลง)ขึ้น (ขึ้น)
110x0800ของแฟล็กโอเวอร์โฟลว์สถานะOV (Overflow)NV (Not Overflow)
12–130x3000ไอโอพีแอลระดับสิทธิ์การเข้าถึง I/O (เฉพาะ 286 ขึ้นไป) จะเป็น 1 ทั้งหมดบน 8086 และ 186 เสมอระบบ
140x4000เอ็นทีแฟล็กงานซ้อน (เฉพาะ 286 ขึ้นไป) จะเป็น 1 เสมอใน 8086 และ 186ระบบ
150x8000เอ็มดีแฟล็กโหมด ( เฉพาะNEC V-series ) [ 6 ]สงวนไว้ในซีพียู Intel ทั้งหมด มีค่าเป็น 1 เสมอใน 8086/186 และ 0 ใน 286 และรุ่นที่ใหม่กว่าควบคุม(เฉพาะ NEC) โหมดเนทีฟ( ใช้งานได้กับ 186 บิต )(เฉพาะ NEC) โหมดจำลอง( ใช้งานร่วมกับ 8080ได้)
EFLAGS
160x0001 0000อาร์เอฟตั้งค่าสถานะการทำงานต่อ (เฉพาะรุ่น 386 ขึ้นไป)ระบบ
170x0002 0000วีเอ็มโหมด เสมือน 8086 (เฉพาะ 386 ขึ้นไป)ระบบ
180x0004 0000เอซีการตรวจสอบการจัดเรียง (486+, วงแหวน 3), การตรวจสอบการเข้าถึง SMAP ( Broadwell +, วงแหวน 0-2)ระบบ
190x0008 0000วีเอฟแฟล็กการขัดจังหวะเสมือน (Pentium+)ระบบ
200x0010 0000วีไอพีการขัดจังหวะเสมือนกำลังรออยู่ (Pentium+)ระบบ
210x0020 0000รหัสประจำตัวสามารถใช้ คำสั่ง CPUID ได้ (Pentium ขึ้นไป)ระบบ
22–290x3FC0 0000ที่สงวนไว้
300x4000 0000(ไม่มี)แฟล็กการโหลดตารางคีย์ AES [ 7 ] ( ซีพียูVIA C3 / C7 ที่มี VIA PadLockเท่านั้น) [ a ]ระบบ
31 0x8000 0000 AIเปิดใช้งานชุดคำสั่งทางเลือก ( เฉพาะโปรเซสเซอร์VIA C5XL เท่านั้น) [ 9 ]ระบบ
อาร์เอ็กซ์32"REX32" (ทางเลือกอื่นสำหรับโหมดความเข้ากันได้ที่อนุญาตให้เข้าถึง GPR 16 ตัว) [ 10 ]
เครื่องหมาย RFLAGS
32-630xFFFF FFFF… …0000 0000ที่สงวนไว้
  1. ^ โปรเซสเซอร์ VIA Nanoและ VIA/Zhaoxin รุ่นหลังๆ ที่รองรับ PadLockจะไม่ใช้บิตที่ 30 ของ EFLAGS อีกต่อไป [ 8 ]

หมายเหตุ: คอลัมน์ mask ในตารางคือบิตมาสก์ AND (ในรูปแบบ ค่า เลขฐานสิบหก ) สำหรับสอบถามค่าแฟล็กภายในค่ารีจิสเตอร์ FLAGS

การใช้งาน

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

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

  • คำสั่ง PUSHF และ POPF ใช้สำหรับถ่ายโอนค่าในรีจิสเตอร์ FLAGS ขนาด 16 บิต
  • คำสั่ง PUSHFD/POPFD (ซึ่งเริ่มใช้ใน สถาปัตยกรรม i386 ) ใช้สำหรับถ่ายโอนข้อมูลรีจิสเตอร์คู่ 32 บิต EFLAGS
  • คำสั่ง PUSHFQ/POPFQ (ซึ่งเริ่มใช้ใน สถาปัตยกรรม x86-64 ) ใช้สำหรับถ่ายโอนข้อมูลรีจิสเตอร์ RFLAGS ขนาด 64 บิตแบบควอดเวิร์ด

ในโหมด 64 บิต PUSHF/POPF และ PUSHFQ/POPFQ สามารถใช้งานได้ แต่ PUSHFD/POPFD ไม่สามารถใช้งานได้[ 11 ] : 4–349, 4–432

บิต 8 บิตล่างของรีจิสเตอร์ FLAGS ยังเปิดให้ SAHF และ LAHF สามารถทำการโหลด/จัดเก็บโดยตรงได้ (โหลด/จัดเก็บ AH ลงในแฟล็ก)

ตัวอย่าง

ความสามารถในการพุชและป๊อปรีจิสเตอร์ FLAGS ช่วยให้โปรแกรมสามารถจัดการข้อมูลใน FLAGS ในรูปแบบที่ไม่มีคำสั่งในภาษาเครื่องรองรับ ตัวอย่างเช่น คำสั่ง `push` และ `pop` cldจะ ล้างและตั้งค่าแฟล็กทิศทาง (DF) ตามลำดับ แต่ไม่มีคำสั่งใดที่จะเติมเต็มค่าของ DF ได้ สามารถทำได้ด้วย โค้ดแอสเซมบลีstdต่อไปนี้:

นี่คือโค้ด 8086 ที่มีรีจิสเตอร์ 16 บิตถูกผลักลงบนสแต็กและรีจิสเตอร์แฟล็กมีขนาดเพียง 16 บิตสำหรับซีพียูตัวนี้pushf ; ใช้สแต็กเพื่อถ่ายโอนแฟล็กpop ax ; … ไปยังรีจิสเตอร์ AX push ax ; และคัดลอกกลับไปยังสแต็กเพื่อจัดเก็บxor ax , 400h ; สลับ (กลับค่า, 'คอมพลีเมนต์') เฉพาะ DF เท่านั้น บิตอื่นๆ ไม่เปลี่ยนแปลงpush ax ; ใช้สแต็กอีกครั้งเพื่อย้ายค่าที่แก้ไขแล้วpopf ; … ไปยังรีจิสเตอร์ FLAGS ; แทรกโค้ดที่ต้องการให้แฟล็ก DF ถูกคอมพลีเมนต์ที่นี่popf ; คืนค่าเดิมของแฟล็ก

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

เริ่มจากIntel Pentium คำสั่ง CPUID จะรายงานรุ่นของโปรเซสเซอร์ อย่างไรก็ตาม วิธีการข้างต้นยังคงมีประโยชน์ในการแยกแยะรุ่นก่อนหน้า ได้

ดูเพิ่มเติม

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=FLAGS_register&oldid=1343534128 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ลงทะเบียน FLAGS

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

ธง

หมายเหตุ: คอลัมน์ mask ในตารางคือ บิตมาสก์ AND (ในรูปแบบ ค่า เลขฐานสิบหก ) สำหรับสอบถามค่าแฟล็กภายในค่ารีจิสเตอร์ FLAGS

การใช้งาน

รีจิสเตอร์ FLAGS ทั้งหมดบรรจุ รหัสเงื่อนไข ซึ่งเป็นบิตแฟล็กที่ทำให้ผลลัพธ์ของ คำสั่ง ภาษาเครื่อง หนึ่ง ส่งผลต่อคำสั่งอื่น คำสั่งทางคณิตศาสตร์และตรรกะจะตั้งค่าแฟล็กบางส่วนหรือทั้งหมด และคำสั่งกระโดดแบบมีเงื่อนไขจะดำเนินการที่แตกต่างกันไปตามค่าของแฟล็กบางตัว...

ตัวอย่าง

ความสามารถในการพุชและป๊อปรีจิสเตอร์ FLAGS ช่วยให้โปรแกรมสามารถจัดการข้อมูลใน FLAGS ในรูปแบบที่ไม่มีคำสั่งในภาษาเครื่องรองรับ ตัวอย่างเช่น คำสั่ง `push` และ `pop` cld จะ ล้างและตั้งค่าแฟล็กทิศทาง (DF) ตามลำดับ แต่ไม่มีคำสั่งใดที่จะเติมเต็มค่าของ DF ได้...