[ บทความ : มาเขียนโปรแกรมกับ 68HC11 กันเถอะ ตอนที่ 5 ]  คำสั่งเกี่ยวกับการโอนย้ายข้อมูล

 

                 

และแล้วบทความตอนที่ 5 ของเราก็กำเนิดแล้วครับ ในบทความนี้เราจะมาเริ่มต้นเรียนรู้คำสั่งกันแล้วนะครับ (เตรียมใจเอาไว้หรือยัง) ซึ่งถ้ากล่าวถึงชุดคำสั่งของ  68HC11 แล้วล่ะก็ จะสามารถจำแนกกลุ่มของคำสั่งออกมาเป็น 7 กลุ่มด้วยกัน นั่นคือ

  1.  กลุ่มจัดการกับข้อมูล

  2.  กลุ่มคำนวณคณิตศาสตร์

  3.  กลุ่มคำสั่งด้านตรรกศาสตร์

  4.  กลุ่มคำสั่งเกี่ยวกับการกระโดด

  5.  กลุ่มคำสั่งเปรียบเทียบ และทดสอบ

  6.  กลุ่มคำสั่งเกี่ยวกับเงื่อนไข

  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 บิต ใครที่นิยมเขียนโปรแกรมกับโปรเซสเซอร์ตระกูลอื่นๆ เวลามาศึกษาโปรเซสเซอร์ อีกตัวหนึ่ง อย่างแรกที่ต้องระวังคือ อย่าเปรียบเทียบว่า อันโน้นเขียนง่ายกว่า หรือ ตัวเดิมเขียนนิดเดียวเอง ไม่เห็นต้องยุ่งยากเลย ถ้าเราคิดอย่างนี้ ผมแนกนำว่า ใช้โปรเซสเซอร์ตัวเดิมน่ะดีแล้วครับ เพราะความคิดข้างต้น จะเป็นสิ่งที่ทำให้เรา เรียนรู้ อะไรได้ยากมาก เสมือนกับว่า เราทำตัวเองเป็นน้ำที่เต็มแก้ว เติมอะไรลงไปก็ไม่รับ (คือว่าล้นออกมาแล้วล่ะ) ส่วนใครที่ยังสนใจ ก็อ่านตอนต่อไปได้คราวหน้าครับ … สวัสดีครับ

  


เขียนโดย : ศุภชัย  บุศราทิจ
Author : Supachai  Budsaratij
วันที่ทำการปรับปรุง : ๑๔ ก.พ. ๒๕๔๖