Embedded Systems - รีจิสเตอร์
รีจิสเตอร์ใช้ใน CPU เพื่อจัดเก็บข้อมูลชั่วคราวซึ่งอาจเป็นข้อมูลที่ต้องประมวลผลหรือแอดเดรสที่ชี้ไปยังข้อมูลที่จะดึงข้อมูล ใน 8051 มีประเภทข้อมูลหนึ่งคือ 8 บิตตั้งแต่ MSB (บิตที่สำคัญที่สุด) D7 ไปจนถึง LSB (บิตที่มีนัยสำคัญน้อยที่สุด) D0 ด้วยประเภทข้อมูล 8 บิตประเภทข้อมูลใด ๆ ที่มีขนาดใหญ่กว่า 8 บิตจะต้องถูกแบ่งออกเป็นกลุ่มข้อมูล 8 บิตก่อนที่จะประมวลผล
รีจิสเตอร์ที่ใช้กันอย่างแพร่หลายของ 8051 คือ A (ตัวสะสม), B, R0-R7, DPTR (ตัวชี้ข้อมูล) และพีซี (ตัวนับโปรแกรม) การลงทะเบียนทั้งหมดนี้มีขนาด 8 บิตยกเว้น DPTR และ PC
การจัดเก็บรีจิสเตอร์ใน 8051
เราจะพูดถึงการลงทะเบียนพื้นที่เก็บข้อมูลประเภทต่อไปนี้ที่นี่ -
- Accumulator
- R ลงทะเบียน
- B ลงทะเบียน
- ตัวชี้ข้อมูล (DPTR)
- ตัวนับโปรแกรม (PC)
- ตัวชี้สแต็ก (SP)
ตัวสะสม
ตัวสะสมรีจิสเตอร์ A ใช้สำหรับการคำนวณทางคณิตศาสตร์และตรรกะทั้งหมด หากไม่มีตัวสะสมผลลัพธ์ของการคำนวณแต่ละรายการ (การบวกการคูณการกะ ฯลฯ ) จะถูกเก็บไว้ในหน่วยความจำหลัก การเข้าถึงหน่วยความจำหลักช้ากว่าการเข้าถึงรีจิสเตอร์เช่นแอคคูมูเลเตอร์เนื่องจากเทคโนโลยีที่ใช้สำหรับหน่วยความจำหลักขนาดใหญ่นั้นช้ากว่า (แต่ถูกกว่า) มากกว่าที่ใช้สำหรับรีจิสเตอร์
รีจิสเตอร์ "R"
รีจิสเตอร์ "R" คือชุดของรีจิสเตอร์แปดตัว ได้แก่ R0, R1 ถึง R7 รีจิสเตอร์เหล่านี้ทำหน้าที่เป็นรีจิสเตอร์หน่วยเก็บข้อมูลสำรองหรือชั่วคราวในการดำเนินการหลายอย่าง ลองพิจารณาตัวอย่างของผลรวม 10 และ 20 เก็บตัวแปร 10 ไว้ในตัวสะสมและอีกตัวแปร 20 นิ้วเช่นลงทะเบียน R4 ในการประมวลผลการดำเนินการเพิ่มเติมให้ดำเนินการคำสั่งต่อไปนี้ -
ADD A,R4
หลังจากดำเนินการตามคำสั่งนี้ตัวสะสมจะมีค่า 30 ดังนั้นรีจิสเตอร์ "R" จึงเป็นตัวช่วยที่สำคัญมากหรือ helper registers. Accumulator เพียงอย่างเดียวจะไม่มีประโยชน์มากนักหากไม่ใช่สำหรับการลงทะเบียน "R" เหล่านี้ การลงทะเบียน "R" มีไว้สำหรับการจัดเก็บค่าชั่วคราว
ให้เราใช้ตัวอย่างอื่น เราจะเพิ่มค่าใน R1 และ R2 เข้าด้วยกันแล้วลบค่าของ R3 และ R4 ออกจากผลลัพธ์
MOV A,R3 ;Move the value of R3 into the accumulator
ADD A,R4 ;Add the value of R4
MOV R5,A ;Store the resulting value temporarily in R5
MOV A,R1 ;Move the value of R1 into the accumulator
ADD A,R2 ;Add the value of R2
SUBB A,R5 ;Subtract the value of R5 (which now contains R3 + R4)
อย่างที่คุณเห็นเราใช้ R5 เพื่อเก็บผลรวมของ R3 และ R4 ไว้ชั่วคราว แน่นอนว่านี่ไม่ใช่วิธีที่มีประสิทธิภาพที่สุดในการคำนวณ (R1 + R2) - (R3 + R4) แต่จะแสดงให้เห็นถึงการใช้รีจิสเตอร์ "R" เป็นวิธีในการจัดเก็บค่าชั่วคราว
การลงทะเบียน "B"
รีจิสเตอร์ "B" นั้นคล้ายกับ Accumulator มากในแง่ที่ว่ามันอาจมีค่า 8 บิต (1 ไบต์) การลงทะเบียน "B" ใช้โดยคำสั่ง 8051 สองคำสั่งเท่านั้น:MUL AB และ DIV AB. ในการคูณหรือหาร A ด้วยหมายเลขอื่นอย่างรวดเร็วและง่ายดายคุณสามารถจัดเก็บหมายเลขอื่นไว้ใน "B" และใช้สองคำสั่งนี้ นอกเหนือจากการใช้คำสั่ง MUL และ DIV แล้วรีจิสเตอร์ "B" ยังใช้เป็นรีจิสเตอร์หน่วยเก็บชั่วคราวอีกตัวหนึ่งเช่นเดียวกับรีจิสเตอร์ตัวที่เก้า
ตัวชี้ข้อมูล
ตัวชี้ข้อมูล (DPTR) เป็นรีจิสเตอร์ 16 บิต (2 ไบต์) ที่ผู้ใช้สามารถเข้าถึงได้ของ 8051 เท่านั้น Accumulator, R0 – R7 register และ B register คือรีจิสเตอร์มูลค่า 1 ไบต์ DPTR มีไว้สำหรับชี้ไปที่ข้อมูล 8051 ใช้เพื่อเข้าถึงหน่วยความจำภายนอกโดยใช้ที่อยู่ที่ระบุโดย DPTR DPTR เป็นรีจิสเตอร์ 16 บิตเท่านั้นและมักใช้เพื่อเก็บค่า 2 ไบต์
ตัวนับโปรแกรม
Program Counter (PC) เป็นแอดเดรส 2 ไบต์ซึ่งบอก 8051 ซึ่งคำสั่งถัดไปในการดำเนินการสามารถพบได้ในหน่วยความจำ พีซีเริ่มต้นที่ 0000h เมื่อ 8051 เริ่มต้นและเพิ่มขึ้นทุกครั้งหลังจากดำเนินการตามคำสั่ง พีซีไม่ได้เพิ่มขึ้นด้วย 1 เสมอไปคำแนะนำบางอย่างอาจต้องใช้ 2 หรือ 3 ไบต์; ในกรณีเช่นนี้พีซีจะเพิ่มขึ้นทีละ 2 หรือ 3
Branch, jumpและ interruptการดำเนินการโหลดตัวนับโปรแกรมด้วยที่อยู่อื่นที่ไม่ใช่ตำแหน่งตามลำดับถัดไป การเปิดใช้งานการรีเซ็ตการเปิดเครื่องจะทำให้ค่าทั้งหมดในรีจิสเตอร์สูญหาย หมายความว่าค่าของพีซีเป็น 0 เมื่อรีเซ็ตโดยบังคับให้ CPU ดึง opcode แรกจากตำแหน่ง ROM 0000 หมายความว่าเราต้องวาง upcode ไบต์แรกในตำแหน่ง ROM 0000 เนื่องจากเป็นที่ที่ CPU คาดว่าจะพบ คำแนะนำแรก
ตัวชี้สแต็ก (SP)
Stack Pointer เช่นเดียวกับการลงทะเบียนทั้งหมดยกเว้น DPTR และ PC อาจมีค่า 8 บิต (1 ไบต์) Stack Pointer บอกตำแหน่งที่จะนำค่าถัดไปออกจากสแตก เมื่อใส่ค่าลงในสแต็กค่าของ SP จะเพิ่มขึ้นจากนั้นค่าจะถูกเก็บไว้ที่ตำแหน่งหน่วยความจำผลลัพธ์ เมื่อค่าถูกดึงออกจากสแต็กค่าจะถูกส่งกลับจากตำแหน่งหน่วยความจำที่ระบุโดย SP จากนั้นค่าของ SP จะลดลง
ลำดับการดำเนินการนี้มีความสำคัญ SP จะเริ่มต้นเป็น 07h เมื่อเริ่มต้น 8051 หากมีการพุชค่าลงในสแต็กพร้อมกันค่าจะถูกเก็บไว้ในที่อยู่ RAM ภายใน 08h เนื่องจาก 8051 จะเพิ่มค่าของ SP (จาก 07h ถึง 08h) ก่อนจากนั้นจะเก็บค่าที่ผลักไว้ที่หน่วยความจำ ที่อยู่ (08h) SP ถูกแก้ไขโดยตรงโดย 8051 โดยหกคำสั่ง: PUSH, POP, ACALL, LCALL, RET และ RETI
ROM Space ใน 8051
สมาชิกในครอบครัว 8051 บางคนมี ROM บนชิป 4K ไบต์เท่านั้น (เช่น 8751, AT8951); บางคนมี ROM 8K เช่น AT89C52 และมีสมาชิกในครอบครัวบางคนที่มี ROM บนชิป 32K ไบต์และ 64K ไบต์เช่น Dallas Semiconductor ประเด็นที่ต้องจำก็คือไม่มีสมาชิกในตระกูล 8051 สามารถเข้าถึง opcode ได้มากกว่า 64K ไบต์เนื่องจากตัวนับโปรแกรมใน 8051 เป็นทะเบียน 16 บิต (ที่อยู่ 0000 ถึง FFFF)
ตำแหน่งแรกของ ROM โปรแกรมภายใน 8051 มีที่อยู่ 0000H ในขณะที่ตำแหน่งสุดท้ายอาจแตกต่างกันขึ้นอยู่กับขนาดของ ROM บนชิป ในบรรดาสมาชิกในครอบครัว 8051 AT8951 มี ROM บนชิป $ k โดยมีที่อยู่หน่วยความจำ 0000 (ตำแหน่งแรก) ถึง 0FFFH (ตำแหน่งสุดท้าย)
8051 Flag Bits และ PSW Register
คำสถานะโปรแกรม (PSW) register คือ 8-bit register หรือที่เรียกว่า flag register. มีความกว้าง 8 บิต แต่ใช้เพียง 6 บิตเท่านั้น สองบิตที่ไม่ได้ใช้คือuser-defined flags. เรียกว่าสี่ธงconditional flagsซึ่งหมายความว่าพวกเขาระบุเงื่อนไขที่เป็นผลหลังจากดำเนินการตามคำสั่ง ทั้งสี่นี้คือCY (พกพา), AC (พกพาเสริม), P (parity) และ OV(ล้น). บิต RS0 และ RS1 ใช้เพื่อเปลี่ยนทะเบียนธนาคาร รูปต่อไปนี้แสดงการลงทะเบียนคำสถานะโปรแกรม
PSW Register มีบิตสถานะที่แสดงสถานะปัจจุบันของ CPU
CY | CA | F0 | RS1 | RS0 | OV | - | ป |
---|
CY | PSW.7 | ถือธง |
AC | PSW 6 | ธงพกพาเสริม |
F0 | PSW 5 | แฟล็ก 0 พร้อมใช้งานสำหรับผู้ใช้สำหรับวัตถุประสงค์ทั่วไป |
RS1 | PSW.4 | ลงทะเบียนตัวเลือกธนาคารบิต 1 |
RS0 | PSW.3 | ลงทะเบียนตัวเลือกธนาคารบิต 0 |
OV | PSW 2 | ค่าสถานะล้น |
- | PSW.1 | ธงที่ผู้ใช้สามารถกำหนดได้ |
ป | PSW.0 | ธงปาริตี ตั้งค่า / ล้างโดยฮาร์ดแวร์ระหว่างรอบคำสั่งเพื่อระบุจำนวนคู่ / คี่ของ 1 บิตในตัวสะสม |
เราสามารถเลือกบิต Register Bank ที่เกี่ยวข้องโดยใช้บิต RS0 และ RS1
RS1 | RS2 | ลงทะเบียนธนาคาร | ที่อยู่ |
---|---|---|---|
0 | 0 | 0 | 00H-07H |
0 | 1 | 1 | 08H-0FH |
1 | 0 | 2 | 10H-17H |
1 | 1 | 3 | 18H-1FH |
CY, the carry flag- แฟล็กพกพานี้ถูกตั้งค่า (1) เมื่อใดก็ตามที่มีการดำเนินการจากบิต D7 ได้รับผลกระทบหลังจากการดำเนินการเพิ่มหรือลบ 8 บิต นอกจากนี้ยังสามารถรีเซ็ตเป็น 1 หรือ 0 ได้โดยตรงโดยคำสั่งเช่น "SETB C" และ "CLR C" โดยที่ "SETB" ย่อมาจาก set bit carry และ "CLR" หมายถึง clear carry
AC, auxiliary carry flag- หากมีการพกพาจาก D3 และ D4 ระหว่างการดำเนินการ ADD หรือ SUB บิต AC จะถูกตั้งค่าไว้ มิฉะนั้นจะถูกล้าง ใช้สำหรับคำสั่งในการคำนวณเลขคณิตทศนิยมที่เข้ารหัสไบนารี
P, the parity flag- แฟล็กพาริตีแสดงถึงจำนวน 1 ในรีจิสเตอร์ตัวสะสมเท่านั้น หากรีจิสเตอร์ A มีเลขคี่ของ 1 ดังนั้น P = 1; และสำหรับเลขคู่ของ 1 P = 0
OV, the overflow flag- แฟล็กนี้ถูกตั้งค่าเมื่อใดก็ตามที่ผลลัพธ์ของการดำเนินการตัวเลขที่เซ็นชื่อมีขนาดใหญ่เกินไปทำให้บิตลำดับสูงล้นเข้าไปในบิตเซ็น ใช้เพื่อตรวจจับข้อผิดพลาดในการดำเนินการทางคณิตศาสตร์ที่ลงนามเท่านั้น
ตัวอย่าง
แสดงสถานะของแฟล็ก CY, AC และ P หลังจากการเพิ่ม 9CH และ 64H ในคำสั่งต่อไปนี้
MOV A, # 9CH
เพิ่ม A, # 64H
Solution: 9C 10011100
+64 01100100
100 00000000
CY = 1 since there is a carry beyond D7 bit
AC = 0 since there is a carry from D3 to D4
P = 0 because the accumulator has even number of 1's