[ บทความ : มาเขียนโปรแกรมกับ 68HC11 กันเถอะ ตอนที่ 5 ] คำสั่งเกี่ยวกับการโอนย้ายข้อมูล |
และแล้วบทความตอนที่
5
ของเราก็กำเนิดแล้วครับ
ในบทความนี้เราจะมาเริ่มต้นเรียนรู้คำสั่งกันแล้วนะครับ
(เตรียมใจเอาไว้หรือยัง)
ซึ่งถ้ากล่าวถึงชุดคำสั่งของ 68HC11 แล้วล่ะก็
จะสามารถจำแนกกลุ่มของคำสั่งออกมาเป็น
7 กลุ่มด้วยกัน
นั่นคือ
กลุ่มจัดการกับข้อมูล
กลุ่มคำนวณคณิตศาสตร์
กลุ่มคำสั่งด้านตรรกศาสตร์
กลุ่มคำสั่งเกี่ยวกับการกระโดด
กลุ่มคำสั่งเปรียบเทียบ
และทดสอบ
กลุ่มคำสั่งเกี่ยวกับเงื่อนไข
กลุ่มคำสั่งควบคุม
ในบทความนี้เราจะมาเริ่มต้นเรียนรู้เกี่ยวกับคำสั่งด้านการจัดการกับข้อมูล
แต่เนื่องจาก คำสั่งนั้น
มีค่อนข้างเยอะ ดังนั้น
ในบทความตอนที่
5
นี้ผมจะยกมาเฉพาะคำสั่งที่เกี่ยวข้องกับการเคลื่อนย้ายข้อมูล
แล้วคำสั่งต่อไปก็จะค่อยๆ
เขียนกันไปเรื่อยๆ นะครับ
จุดประสงค์
เรียนรู้คำสั่งที่เกี่ยวข้องกับการเคลื่อนย้ายข้อมูล
อันได้แก่ BSET, BCLR, LDAA, LDAB, STAA, STAB, TAB, TBA, TAP,
TPA, CLRA, CLRB และ
CLR
คำสั่ง/รูปแบบและผลการทำงาน
ในการอธิบายคำสั่ง
ผมจะจำแนกแต่ละคำสั่งออกมาเป็น
3 หัวข้อคือ
รูปแบบของการเขียน ,
ผลที่เกิดต่อ
CCR หลังจากที่คำสั่งนั้น ๆ
ได้ประมวลผลไปแล้ว และ
คำอธิบายสั้นๆ เพื่อบอกว่า
คำสั่งนั้น
มีการทำงานอย่างไร
BSET |
|
รูปแบบ | BSET M, mm |
ผลต่อ CCR | N, Z, V=0 |
หน้าที่ |
คำสั่งนี้จะทำการเปลี่ยนให้บิตที่ mm ของหน่วยความจำตำแหน่ง M ให้เป็น 1 โดยการนำค่า mm ไปกระทำบิตแบบ หรือ (OR) กับหน่วยความจำ M |
BCLR |
|
รูปแบบ | BCLR M,mm |
ผลต่อ CCR | N, Z, V=0 |
หน้าที่ |
คำสั่งนี้จะทำการเปลี่ยนให้บิตที่ mm ของหน่วยความจำตำแหน่ง M ให้เป็น 0 โดยการนำค่า mm ไป ทำ complement หลังจากนั้นก็กระทำบิตแบบ และ (AND) กับหน่วยความจำ M |
LDAA |
|
รูปแบบ | LDAA M |
ผลต่อ CCR | N, Z, V=0 |
หน้าที่ | คำสั่งนี้จะนำข้อมูลจากหน่วยความจำตำแหน่ง M มาเก็บที่ เรจิสเตอร์ A |
LDAB |
|
รูปแบบ | LDAB M |
ผลต่อ CCR | N, Z, V=0 |
หน้าที่ | คำสั่งนี้จะนำข้อมูลจากหน่วยความจำตำแหน่ง M มาเก็บที่เรจิสเตอร์ B |
STAA |
|
รูปแบบ | STAA M |
ผลต่อ CCR | N, Z, V=0 |
หน้าที่ | คำสั่งนี้จะนำข้อมูลจากเรจิสเตอร์ A มาเก็บที่ หน่วยความจำตำแหน่ง M |
STAB |
|
รูปแบบ | STAB M |
ผลต่อ CCR | N, Z, V=0 |
หน้าที่ | คำสั่งนี้จะนำข้อมูลจากเรจิสเตอร์ B มาเก็บที่ หน่วยความจำตำแหน่ง M |
TAB |
|
รูปแบบ | TAB |
ผลต่อ CCR | N, Z, V=0 |
หน้าที่ | คำสั่งนี้จะนำข้อมูลจากเรจิสเตอร์ A มาเก็บที่ เรจิสเตอร์ B |
TBA |
|
รูปแบบ | TBA |
ผลต่อ CCR | N, Z, V=0 |
หน้าที่ | คำสั่งนี้จะนำข้อมูลจากเรจิสเตอร์ B มาเก็บที่ เรจิสเตอร์ A |
TAP |
|
รูปแบบ | TAP |
ผลต่อ CCR | ไม่มีผลใดๆ |
หน้าที่ | คำสั่งนี้จะอ่านข้อมูล จาก CCR แล้วนำไปเก็บที่ เรจิสเตอร์ A |
TPA |
|
รูปแบบ | TPA |
ผลต่อ CCR | S, X, H, I, N, Z, V, C |
หน้าที่ | คำสั่งนี้จะอ่านข้อมูล จาก เรจิสเตอร์ A แล้วนำไปเก็บที่ CCR |
CLRA |
|
รูปแบบ | CLRA |
ผลต่อ CCR | N=0, Z=1, V=0, C=0 |
หน้าที่ | คำสั่งนี้จะทำให้ เรจิสเตอร์ A มีค่าเป็น 0 |
CLRB |
|
รูปแบบ | CLRB |
ผลต่อ CCR | N=0, Z=1, V=0, C=0 |
หน้าที่ | คำสั่งนี้จะทำให้ เรจิสเตอร์ B มีค่าเป็น 0 |
CLR |
|
รูปแบบ | CLR M |
ผลต่อ CCR | N=0, Z=1, V=0, C=0 |
หน้าที่ | คำสั่งนี้จะทำให้หน่วยความจำตำแหน่งที่ M มีค่าเป็น 0 |
ตัวอย่างโปรแกรม |
ข้อมูลใน .ASM |
;
Filename : hc11w03.asm ;
Author :
Supachai Budsaratij ;
Assembler : Cross-32 version 4 CPU
"68HC11.TBL" HOF
"MOT8" PORT_C:
EQU 1003h DDRC:
EQU 1007h ORG
0000h DAT:
DFB 0FFh ORG
0F800h MAIN: LDS
#00Fh LDAB
#0FFh STAB
DDRC CLR
DAT
; DAT = 00000000b BSET
DAT,0FCh ; DAT = DAT
or 11111100b
;
= 00000000b or 11111100b
; =
11111100b BCLR
DAT,02Ah ; DAT = DAT
and (not(00101010b))
; =
DAT and 11010101b
; =
11111100b and 11010101b ;
= 11010100b LDAB
DAT
; B =
11010100b TBA
; A = B
; =
11010100b STAA
PORT_C MAIN_LOOP: BRA
MAIN_LOOP ORG
0FFFEh
DWM
MAIN END
|
ข้อมูลใน .LST |
; Filename :
hc11w03.asm
; Author :
Supachai Budsaratij
; Assembler : Cross-32 version 4
0000
CPU "68HC11.TBL" 0000
HOF "MOT8"
1003 =
PORT_C: EQU
1003h 1007 =
DDRC: EQU
1007h
0000
ORG 0000h 0000 FF
DAT: DFB
0FFh
F800
ORG 0F800h F800
MAIN: F800 8E000F
LDS #00Fh F803 C6FF
LDAB #0FFh F805 F71007
STAB DDRC
F808 7F0000
CLR DAT
; DAT = 00000000b F80B 1400FC
BSET DAT,0FCh
; DAT = DAT or 11111100b
; =
00000000b or 11111100b
; =
11111100b F80E 15002A
BCLR DAT,02Ah
; DAT = DAT and (not(00101010b))
; =
DAT and 11010101b
;
= 11111100b and 11010101b
; =
11010100b F811 D600
LDAB DAT
; B =
11010100b F813 17
TBA
; A = B
;
= 11010100b F814 B71003
STAA PORT_C F817
MAIN_LOOP: F817 20FE
BRA MAIN_LOOP
FFFE
ORG 0FFFEh FFFE F800
DWM MAIN
0000
END 0000
DAT
1007 DDRC
F800 MAIN
F817 MAIN_LOOP 1003 PORT_C
|
ข้อมูลใน .HEX |
S1040000FFFC S113F8008E000FC6FFF710077F00001400FC1500E0 S10CF8102AD60017B7100320FEEC S105FFFEF80005 S9030000FC |
สรุป
เป็นอย่างไรบ้างครับ
ชุดคำสั่งกลุ่มแรกที่เราได้เรียนรู้กัน
คราวต่อไป
จะเป็นคำสั่งเคลื่อนย้ายข้อมูลเหมือนกับบทความนี้
แต่จะเป็นการเคลื่อนย้ายข้อมูลขนาด
16 บิต
ใครที่นิยมเขียนโปรแกรมกับโปรเซสเซอร์ตระกูลอื่นๆ
เวลามาศึกษาโปรเซสเซอร์
อีกตัวหนึ่ง
อย่างแรกที่ต้องระวังคือ
อย่าเปรียบเทียบว่า
อันโน้นเขียนง่ายกว่า หรือ
ตัวเดิมเขียนนิดเดียวเอง
ไม่เห็นต้องยุ่งยากเลย
ถ้าเราคิดอย่างนี้ ผมแนกนำว่า
ใช้โปรเซสเซอร์ตัวเดิมน่ะดีแล้วครับ
เพราะความคิดข้างต้น
จะเป็นสิ่งที่ทำให้เรา
เรียนรู้ อะไรได้ยากมาก
เสมือนกับว่า
เราทำตัวเองเป็นน้ำที่เต็มแก้ว
เติมอะไรลงไปก็ไม่รับ (คือว่าล้นออกมาแล้วล่ะ)
ส่วนใครที่ยังสนใจ
ก็อ่านตอนต่อไปได้คราวหน้าครับ
สวัสดีครับ