[ บทความ : เรียนรู้ z80 ] ตอนที่ 16 เรื่อง คำสั่งเลื่อนและหมุนบิต

เรียนรู้ Z80 ตอนที่ 16

คำสั่งเลื่อนและหมุนบิต

สวัสดีครับ ... มาเจอกันอีกครั้ง กับบทความเกี่ยวกับ Z80 ... บทความนี้เป็นครั้งที่ 16 แล้วนะครับ เหลืออีก 2 ตอน เรา ก็จะจบบทความการเรียนรู้ Z80 (ระดับง่าย) กันล่ะ ... ครั้งนี้เป็นเรื่องของการ เลื่อนและการหมุนบิต ... นึกภาพออกไปมครับ ว่า ทั้งสองแบบนี้น่าจะทำงานอย่างไร ... เอาล่ะ มาดูการเลื่อนบิตก่อนครับ ...

มาดูหลักการทำงานของการเลื่อนบิตกันต่อครับ

ทั้ง 4 ลักษณะด้านบน เป็นการทำงานแบบทั่วไปครับ ... มาดูกันดีกว่าว่า Z80 นั้นสนุบสนุน การเลื่อนและหมุนบิต ในแบบใดบ้าง ...

ตาราง 16-1 คำสั่งเกี่ยวกับการหมุนและเลื่อนบิต

Instruction
Source/Target
Flag
Operation
RLCA
ไม่มี
C, N=0, H=0
ทำการหมุนบิตของ A ไปทางซ้าย จำนวน 1 ครั้ง (1 บิต) ดูหลักการทำงาน R1
RLA
ไม่มี
C, N=0, H=0
ทำการหมุนบิตของ A ไปทางซ้าย จำนวน 1 ครั้ง (1 บิต) ดูหลักการทำงาน R2
RRCA
ไม่มี
C, N=0, H=0
ทำการหมุนบิตของ A ไปทางขวา จำนวน 1 ครั้ง (1 บิต) ดูหลักการทำงาน R3
RRA
ไม่มี
C, N=0, H=0
ทำการหมุนบิตของ A ไปทางขวาจำนวน 1 ครั้ง (1 บิต) ดูหลักการทำงาน R4
RLC
s
C, Z, P, S, N=0, H=0
ทำการหมุนบิตของ s ไปทางซ้าย จำนวน 1 ครั้ง (1 บิต) ดูหลักการทำงาน R1
RL
s
C, Z, P, S, N=0, H=0
ทำการหมุนบิตของ s ไปทางซ้าย จำนวน 1 ครั้ง (1 บิต) ดูหลักการทำงาน R2
RRC
s
C, Z, P, S, N=0, H=0
ทำการหมุนบิตของ s ไปทางขวา จำนวน 1 ครั้ง (1 บิต) ดูหลักการทำงาน R3
RR
s
C, Z, P, S, N=0, H=0
ทำการหมุนบิตของ s ไปทางขวาจำนวน 1 ครั้ง (1 บิต) ดูหลักการทำงาน R4
SRA
s
C, Z, P, S, N=0, H=0
ทำการเลื่อนบิตของ s ไปทางขวา จำนวน 1 ครั้ง (1 บิต) ดูหลักการทำงาน S5
RLA
s
C, Z, P, S, N=0, H=0
ทำการเลื่อนบิตของ s ไปทางซ้ายจำนวน 1 ครั้ง (1 บิต) ดูหลักการทำงาน S1
SRL
s
C, Z, P, S, N=0, H=0
ทำการเลื่อนบิตของ s ไปทางขวา จำนวน 1 ครั้ง (1 บิต) ดูหลักการทำงาน S3
RLD
ไม่มี
Z, P, S, N=0, H=0
ดูหลักการทำงานของ RLD ด้านล่าง
RRD
ไม่มี
Z, P, S, N=0, H=0
ดูหลักการทำงานของ RRD ด้านล่าง

หมายเหตุ

s คือ (HL), (IX + d), (IY + d), B,C,D,E,H หรือ L

หลักการทำงาน

คำสั่ง RLD

คำสั่งนี้เป็นการหมุนบิตไปทางซ้ายครับ แต่ว่าทำงานกับตัวเลขแบบ BCd โดยการทำงานนั้น จะอาศัย A กับ (HL) โดย (HL) เป็นข้อมูลที่เราต้องการ ส่วน A นั้นใช้ประกอบการหมุน ... หลักการทำงานเป็นรูปต่อไปนี้ครับ

ตัวอย่าง เช่น A=12h ที่ (HL) เป็น 35h เมื่อเราสั่ง RLD จะได้ว่า A=13h และ (HL) เป็น 52h

คำสั่ง RRD

หลักการทำงานคล้ายกับ RLD... แต่เป็นการหมุนไปทางขวา

ตัวอย่างเช่น A=12h , (HL)=35h เมื่อสั่ง RRD จะได้ว่า A=15h และ (HL) = 23h

ตัวอย่างที่ 1

ตัวอย่างแรกเป็นการใช้ RRD ครับ .. ผมกำหนดให้ A เป็น 01h , HL ชี้ไปที่ DATA ซึ่ง DATA เก็บค่า 29h ดังนั้น ผลเลยได้ออกมาเป็น 9 ใช่ไหมครับ ... ผมก็ลองเปลี่ยนรูปแบบการแสดงผลดูบ้าง ... นี่เลย ใช้ 7Segment กันเลย ... แต่ 7 Segment มีข้อบังคับอยู่ว่า เราต้องส่งรหัสให้ถูกต้องด้วย จึงจะดูรู้เรื่อง ... ผมก็เลย รวบรวม pattern ของมันเอาไปไว้ใน N0 ถึง N9 โดย N0 เป็น pattern ของ ตัวเลข 0 ... ไปเรื่อยจน N9 ก็จะเก็บ pattern ของ เลข 9 ... มาดู code กันครับ

ตัวอย่างที่ 2

ตัวอย่างนี้เป็นการปรับปรุง โปรแกรมที่ติดต่อกับ LED ครับ ... ผมใช้การเลื่อนบิตไปทางซ้าย สำหรับการเปลี่ยน รูปแบบการ แสดงผล อยากทราบไหมครับว่า ผลการทำงานเป็นอย่างไร ... ลองพิมพ์โปรแกรมต่อไปนี้แล้ว run ดูครับ

ตัวอย่างที่ 3

ตัวอย่างที่ 3 ของเราจะคล้ายๆ กับตัวอย่างที่ 2 เพียงแต่ว่า เรากำหนดให้ D เป็น 0FEh แล้วก็ใช้ RLC แทนการเลื่อนบิต ... code ของโปรแกรมเป็นดังนี้ครับ

เย้ ... จบตัวอย่างเรื่อง การเลื่อน และการหมุนบิตเสียที ... เป็นอย่างไรบ้างครับ มาถึงตรงนี้ เราก็จะสามารถเขียน โปรแกรมที่ซับซ้อนมากๆ ได้แล้วล่ะครับ ... แต่ยิ่งเราเขียนซับซ้อนเท่าไร ปัญหาของเราก็คือ จำนวนบรรทัดก็ยิ่งเยอะใช่ไหมครับ ... ฮ่าๆ ... นี่ล่ะความสนุกของภาษาแอสเซมบลี ... เพราะถ้าเราออกแบบโปรแกรมไม่ดี ตัว register ก็ไม่พอใช้ ... เอ๋ ... มี stack นี่นา ... ทำไมผมไม่ใช่ล่ะ ... คำตอบคือ ตอนนี้มันยังพอใช้ไงครับ เราก็เลยไม่ใช้ไง .. .เอาไว้ในบทความ เรื่อง การเขียนโปรแกรมย่อย เราค่อยมาลุยกันนะครับ :D

เจอกันคราวหน้าครับ .. .เป็นเรื่องชุดคำสั่งที่ตกหล่นไปครับ ... และมีประโยชน์เสียด้วยสิ (ทำหล่นได้ไงหนอเรา) ...



เขียนโดย : ศุภชัย บุศราทิจ
Author : Supachai Budsaratij
e-mail : raek@se-ed.net
วันที่ทำการปรับปรุง : ๑๖ เม.ย. ๒๕๔๔