อ่าน 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 |
| ธง | ||||||
| 0 | 0x0001 | ซีเอฟ | ถือธง | สถานะ | CY (แบก) | NC (ห้ามพกพา) |
| 1 | 0x0002 | บีอาร์กี | I/O Trap ( เฉพาะ NEC V25 /V35/V55 เท่านั้น) [ 2 ]สงวนไว้และมีค่าเป็น 1 เสมอในEFLAGSบนโปรเซสเซอร์ x86 อื่นๆ ทั้งหมด[ 3 ] [ 4 ] | ควบคุม | (เฉพาะ NEC) อนุญาตให้ใช้งาน I/O ได้ | (เฉพาะ NEC) I/O ติดค้าง |
| 2 | 0x0004 | พีเอฟ | ธงความเท่าเทียมกัน | สถานะ | PE (Parity Even) | PO (Parity Odd) |
| 3 | 0x0008 | — | สงวนไว้[ 4 ] | — | ||
| 4 | 0x0010 | เอเอฟ | ธงแบกเสริม[ 5 ] | สถานะ | AC (อุปกรณ์ช่วยพกพา) | NA (ห้ามพกพาสัมภาระเสริม) |
| 5 | 0x0020 | — | สงวนไว้[ 4 ] | — | ||
| 6 | 0x0040 | ซีเอฟ | ธงศูนย์ | สถานะ | ZR (ศูนย์) | NZ (ไม่ใช่ศูนย์) |
| 7 | 0x0080 | เอสเอฟ | ป้ายธง | สถานะ | NG (ลบ) | PL (บวก) |
| 8 | 0x0100 | ทีเอฟ | ธงดัก (ขั้นตอนเดียว) | ควบคุม | ||
| 9 | 0x0200 | ถ้า | แฟล็กเปิดใช้งานการขัดจังหวะ | ควบคุม | EI (เปิดใช้งานการขัดจังหวะ) | DI (ปิดใช้งานการขัดจังหวะ) |
| 10 | 0x0400 | ดีเอฟ | ธงบอกทิศทาง | ควบคุม | DN (ลง) | ขึ้น (ขึ้น) |
| 11 | 0x0800 | ของ | แฟล็กโอเวอร์โฟลว์ | สถานะ | OV (Overflow) | NV (Not Overflow) |
| 12–13 | 0x3000 | ไอโอพีแอล | ระดับสิทธิ์การเข้าถึง I/O (เฉพาะ 286 ขึ้นไป) จะเป็น 1 ทั้งหมดบน 8086 และ 186 เสมอ | ระบบ | ||
| 14 | 0x4000 | เอ็นที | แฟล็กงานซ้อน (เฉพาะ 286 ขึ้นไป) จะเป็น 1 เสมอใน 8086 และ 186 | ระบบ | ||
| 15 | 0x8000 | เอ็มดี | แฟล็กโหมด ( เฉพาะNEC V-series ) [ 6 ]สงวนไว้ในซีพียู Intel ทั้งหมด มีค่าเป็น 1 เสมอใน 8086/186 และ 0 ใน 286 และรุ่นที่ใหม่กว่า | ควบคุม | (เฉพาะ NEC) โหมดเนทีฟ( ใช้งานได้กับ 186 บิต ) | (เฉพาะ NEC) โหมดจำลอง( ใช้งานร่วมกับ 8080ได้) |
| EFLAGS | ||||||
| 16 | 0x0001 0000 | อาร์เอฟ | ตั้งค่าสถานะการทำงานต่อ (เฉพาะรุ่น 386 ขึ้นไป) | ระบบ | ||
| 17 | 0x0002 0000 | วีเอ็ม | โหมด เสมือน 8086 (เฉพาะ 386 ขึ้นไป) | ระบบ | ||
| 18 | 0x0004 0000 | เอซี | การตรวจสอบการจัดเรียง (486+, วงแหวน 3), การตรวจสอบการเข้าถึง SMAP ( Broadwell +, วงแหวน 0-2) | ระบบ | ||
| 19 | 0x0008 0000 | วีเอฟ | แฟล็กการขัดจังหวะเสมือน (Pentium+) | ระบบ | ||
| 20 | 0x0010 0000 | วีไอพี | การขัดจังหวะเสมือนกำลังรออยู่ (Pentium+) | ระบบ | ||
| 21 | 0x0020 0000 | รหัสประจำตัว | สามารถใช้ คำสั่ง CPUID ได้ (Pentium ขึ้นไป) | ระบบ | ||
| 22–29 | 0x3FC0 0000 | — | ที่สงวนไว้ | — | ||
| 30 | 0x4000 0000 | (ไม่มี) | แฟล็กการโหลดตารางคีย์ AES [ 7 ] ( ซีพียูVIA C3 / C7 ที่มี VIA PadLockเท่านั้น) [ a ] | ระบบ | ||
| 31 | 0x8000 0000 | AI | เปิดใช้งานชุดคำสั่งทางเลือก ( เฉพาะโปรเซสเซอร์VIA C5XL เท่านั้น) [ 9 ] | ระบบ | ||
| อาร์เอ็กซ์32 | "REX32" (ทางเลือกอื่นสำหรับโหมดความเข้ากันได้ที่อนุญาตให้เข้าถึง GPR 16 ตัว) [ 10 ] | |||||
| เครื่องหมาย RFLAGS | ||||||
| 32-63 | 0xFFFF FFFF… …0000 0000 | — | ที่สงวนไว้ | — | ||
- ^ โปรเซสเซอร์ 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 จะรายงานรุ่นของโปรเซสเซอร์ อย่างไรก็ตาม วิธีการข้างต้นยังคงมีประโยชน์ในการแยกแยะรุ่นก่อนหน้า ได้
ดูเพิ่มเติม
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ลงทะเบียน FLAGS
รี จิสเตอร์ FLAGS เป็น รีจิสเตอร์สถานะ ที่เก็บสถานะปัจจุบันของ ซีพียู x86 ขนาดและความหมายของบิตสถานะจะแตกต่างกันไปตามสถาปัตยกรรม โดยปกติแล้วจะสะท้อนผลลัพธ์ของการคำนวณทางคณิตศาสตร์...
ธง
หมายเหตุ: คอลัมน์ mask ในตารางคือ บิตมาสก์ AND (ในรูปแบบ ค่า เลขฐานสิบหก ) สำหรับสอบถามค่าแฟล็กภายในค่ารีจิสเตอร์ FLAGS
การใช้งาน
รีจิสเตอร์ FLAGS ทั้งหมดบรรจุ รหัสเงื่อนไข ซึ่งเป็นบิตแฟล็กที่ทำให้ผลลัพธ์ของ คำสั่ง ภาษาเครื่อง หนึ่ง ส่งผลต่อคำสั่งอื่น คำสั่งทางคณิตศาสตร์และตรรกะจะตั้งค่าแฟล็กบางส่วนหรือทั้งหมด และคำสั่งกระโดดแบบมีเงื่อนไขจะดำเนินการที่แตกต่างกันไปตามค่าของแฟล็กบางตัว...
ตัวอย่าง
ความสามารถในการพุชและป๊อปรีจิสเตอร์ FLAGS ช่วยให้โปรแกรมสามารถจัดการข้อมูลใน FLAGS ในรูปแบบที่ไม่มีคำสั่งในภาษาเครื่องรองรับ ตัวอย่างเช่น คำสั่ง `push` และ `pop` cld จะ ล้างและตั้งค่าแฟล็กทิศทาง (DF) ตามลำดับ แต่ไม่มีคำสั่งใดที่จะเติมเต็มค่าของ DF ได้...