วันพฤหัสบดีที่ 30 ตุลาคม พ.ศ. 2557

เขียนASSEMBLYง่ายๆด้วยLISTING FILE






เขียนASSEMBLYง่ายๆด้วยLISTING FILE
10/3/2557 SONGCHAI PRAPATRUNGSEE
เขียนASSEMBLYง่ายๆด้วยLISTING FILE
1 สร้างโปรเจคไฟล์ภาษาซี(*.C)
   และต้องไม่ADD STARTUP.A51เข้ามา
   เพราะจะเกิดการซ้อนทับ(OVERLAP)กับภาษาASSEMBLY
1 คลิกPROJECT
2 คลิกOPTIONS FOR TARGET
3 คลิกLISTING (*.LST)
4 ติ๊กถูกASSEMBLY CODE
5 คลิกOK
6 คลิกBUILDคอมไพล์ให้ผ่านก่อน
   ให้จดว่าใช้DATA(RAM)กับCODE(ROM)ไปเท่าไร
7 คลิกFILE
8 คลิกNEW
9 คลิกFILE
10 คลิกSAVE AS
11 พิมพ์ชื่อไฟล์ในช่องFILE NAME
     ตามด้วยนามสกุล.ASMหรือ.A51
12 คลิกSAVE ก็จะได้ไฟล์.ASMหรือ.A51แล้ว
13 คลิกFILE
14 คลิกOPEN
15 จะไม่เห็นชื่อไฟล์.LST
     ให้พิมพ์ชื่อไฟล์ตามด้วยนามสกุล .LSTที่ช่องFILE NAME
16 หรือจะคลิกตรงชื่อไฟล์.LSTที่โชว์ขึ้นมาก็ได้
17 คลิกOPEN
18 ทำการCOPYตั้งแต่  ” ; FUNCTION main (BEGIN)
    จนถึง  ; FUNCTION main (END) ”
19 PASTEวางโค๊ดแอสเซ็มบลีที่COPYมาลงในไฟล์.ASM
20 ลบ LOC,OBJ,R ออกให้หมด
21 จากนั้นพิมพ์คำว่าENDลงในบรรทัดท้ายสุด
22 คลิกขวาไฟล์.C ที่อยู่ในSOURCE GROUP1
23 คลิกREMOVE FILE *.C 
24 คลิกYES
     เท่านี้ไฟล์.C ก็ออกจากSOURCE GROUP1แล้ว
25 คลิกขวาSORUCE GROUP1
26 คลิกADD EXISTING FILES TO GROUP SOURCE GROUP1
27 จะไม่เห็นชื่อไฟล์.ASM
     ให้พิมพ์ชื่อไฟล์ตามด้วย .ASM ที่ช่องFILE NAME     
28 หรือจะคลิกตรงชื่อไฟล์.ASMที่โชว์ขึ้นมาก็ได้
29 คลิกADD
    ชื่อไฟล์ก็จะเข้าไปในSOURCE GROUP1แล้ว
30 คลิกCLOSE
31 คลิกBUILDทำการคอมไพล์ ไฟล์.ASM
    สังเกตุDATA(RAM),CODE(ROM)
    ไฟล์.ASM ใช้น้อยกว่าไฟล์.C
    แต่เวลาสร้างโปรเจคแอสเซมบลี
    ต้องไม่เอาSTARTUP .A51เข้ามา
    เพราะจะทำเกิดการWARNING
    และจะใช้ DATA(RAM),CODE(ROM)เท่ากับไฟล์.Cทันที
====================
CODE=ROMคือหน่วยความจำถาวรซึ่งเป็นส่วนที่อัด(FLASH)
    คำสั่งในรูปเลขฐาน2 หรือภาษาเครื่อง(MACHINE CODE)
    คือเวลาอัดจะเป็นไฟกับกราวด์
    อัดเข้าไปในROMภายในไมโครคอนโทรลเลอร์
    หน่วยความจำROMเวลาไม่มีไฟหน่วยความจำก็จะไม่สูญหาย
    หน่วยความจำROMในเวลาใช้งานจะอ่านได้
    แต่ไม่สามารถเขียนได้
RAM=หน่วยความจำชั่วคราวซึ่งสามารถเขียนอ่านได้
    แต่เวลาไม่มีไฟหน่วยความจำส่วนนี้ก็จะหายไปหมด
1ADDRESS=1REGISTER=1BYTE
1BYTE=8BIT=11111111=0-255   
    บิทขวาสุดคือบิท0=LSB(LEAST SIGNIFICANT BIT)
    บิทซ้ายสุดคือบิท7=MSB(MOST SIGNIFICANT BIT)
    บิทขวาสุดคือบิท0 จะมีค่าประจำหลักเป็น 1
    บิท1 จะมีค่าประจำหลักเป็น 2
    บิท2 จะมีค่าประจำหลักเป็น 4
    บิท3 จะมีค่าประจำหลักเป็น 8
    บิท4 จะมีค่าประจำหลักเป็น 16
    บิท5 จะมีค่าประจำหลักเป็น 32
    บิท6 จะมีค่าประจำหลักเป็น 64
    บิท7 จะมีค่าประจำหลักเป็น 128
    รวมบิท0-บิท7 = 8บิท = 0-255 (บิท0-บิท7ต้องเป็น1ทุกบิท)
1 = เลขฐานสิบหก 1 = เลขฐานสอง 0001
2 = เลขฐานสิบหก 2 = เลขฐานสอง 0010
3 = เลขฐานสิบหก 3 = เลขฐานสอง 0011
4 = เลขฐานสิบหก 4 = เลขฐานสอง 0100
5 = เลขฐานสิบหก 5 = เลขฐานสอง 0101
6 = เลขฐานสิบหก 6 = เลขฐานสอง 0110
7 = เลขฐานสิบหก 7 = เลขฐานสอง 0111
8 = เลขฐานสิบหก 8 = เลขฐานสอง 1000
9 = เลขฐานสิบหก 9 = เลขฐานสอง 1001
10 = เลขฐานสิบหก A = เลขฐานสอง 1010
11 = เลขฐานสิบหก B = เลขฐานสอง 1011
12 = เลขฐานสิบหก C = เลขฐานสอง 1100
13 = เลขฐานสิบหก D = เลขฐานสอง 1101
14 = เลขฐานสิบหก E = เลขฐานสอง 1110
15 = เลขฐานสิบหก F = เลขฐานสอง 1111
เลขฐานสิบหก1ตัวมี4บิท มีค่าสูงสุดอยู่ในช่วง0-15
และให้จำไว้ว่าค่าประจำบิทถัดไปจะต้องมีค่าคูณ2เสมอ เช่น
FA = 1111 1010 = 250
    A ที่อยู่ขวามือสุดเรียกว่า NIBBLE LOW
    Fที่อยู่ซ้ายมือสุดเรียกว่า NIBBLE HIGH

ในภาษาASSEMBLYตัวอักษรพิมพ์เล็กหรือพิมพ์ใหญ่
    ถือว่าเป็นตัวอักษรเดียวกัน
เลขฐานสิบหก จะมีสัญลักษณ์บ่งบอกคือ0XหรือH เช่น
    1 = เลขฐานสิบหก 0x01 หรือ 01H
    ถ้าเลขฐานสิบหกที่ใช้สัญญลักษณ์H
    ถ้าขึ้นต้นด้วยตัวอักษรจะต้องเติม0 เช่น
    255 = FFHอย่างนี้ไม่ได้ต้องเติม0เป็น 0FFH 
เลขฐานแปด จะมีสัญลักษณ์บ่งบอกคือ O หรือ Q
เลขฐานสอง จะมีสัญลักษณ์บ่งบอกคือ B
เลขฐานสิบ จะไม่มีสัญลักษณ์ หมายความว่า
    ถ้าไม่มีสัญญลักษณ์ให้ถือว่าเป็นเลขฐานสิบ
    เลขฐานสิบคือเลขที่ใช้ในชีวิตประจำวัน

=========================== 
ไฟล์.C
#include <REGX51.H>/*เอาไฟล์REGX51.Hจากภายนอก
                      เข้ามาร่วมในการคอมไพล์
                      เป็นไฟล์เลขฐานสิบหก(HEX FILE)
                      ไฟล์REGX51.H เป็นไฟล์ที่กำหนดชื่อ                 
                      แทนADDRESSในไมโครคอนโทรลเลอร์
                      เพื่อให้จดจำได้ง่าย
unsigned char m,n,o; /*ประกาศตัวแปรm,n,o
                                  ให้อยู่ในช่วง0-255*/

void main(void){ //ฟังชันหลัก
      m=2;  //เอาค่า2ไปเก็บไว้ในตัวแปร m
      n=3;   //เอาค่า3ไปเก็บไว้ในตัวแปร n
      o=m+n;  //เอาผลบวกของm,nไปเก็บไว้ในตัวแปร o
}

แปลงไฟล์ซีเป็นแอสเซมบลีด้วยLISTING FILEในKEIL
ได้ดังนี้

LOC   OBJ     ตัวแปร*.C   SOURCE
                 ; FUNCTION main (BEGIN)
                                           ; SOURCE LINE # 5
                                           ; SOURCE LINE # 6
0000   750002      R     MOV     m,#02H
                                           ; SOURCE LINE # 7
0003   750003      R     MOV     n,#03H
                                           ; SOURCE LINE # 8
0006   E500        R     MOV     A,m
0008   2500        R     ADD     A,n
000A   F500        R     MOV     o,A
                                           ; SOURCE LINE # 9
000C 22                RET    
             ; FUNCTION main (END)  

เสา=COLUMN
เสาที่1  LOC=LOCATIONแอดเดรสในROM
เสาที่2  OBJ=OBJECT CODEหมายถึงCODEที่อัด(FLASH)
    เข้าไปในROM ของไมโครคอนโทรลเลอร์
    เมื่อต่อวงจรและไฟเข้าไปในไมโคร
    คอนโทรลเลอร์ คำสั่งในROMจะเป็น1กับ0 หรือไฟกับกราวด์
    ก็จะไปสั่งให้RAMให้ทำงานตามที่เราเขียนสั่งงานไว้นั่นเอง
เสาที่R = RELOCATE ให้ย้ายหรือทำใหม่ ตัวแปรในไฟล์.C
เสาที่ 4  SOURCE=ซอร์สโคดคือคำสั่งที่เขียนขึ้นมา
เสาที่ 5 = คำอธิบาย (COMMENT)
==========================  
แปลงเป็นแอสเซมบลีได้ดังนี้
                     ; FUNCTION main (BEGIN)
ORG 0000H    ;ต้องเขียนขึ้นเองถ้าไม่มีจะเริ่มต้นที่แอดเดรส0
m EQU 8        ;RAM แอดเดรสที่8 เก็บไว้ในสัญญลักษณ์ m
n EQU 9         ;RAM แอดเดรสที่9 เก็บไว้ในสัญญลักษณ์ n
o EQU 10        ;RAM แอดเดรสที่10 เก็บไว้ในสัญญลักษณ์ o            

 MOV     m,#02H   ;ค่า2เก็บไว้ใน m
                                            
 MOV     n,#03H   ;ค่า3เก็บไว้ใน n
                                            
 MOV     A,m      ;ค่าm เก็บไว้ใน A , A=2
 ADD     A,n       ;A+n ผลลัพท์เก็บไว้ใน A , A=5
 MOV     o,A       ;ค่าA เก็บไว้ใน o , o=5
                                            
 RET      ;RETURN ย้อนกลับไปทำใหม่
END       ;ต้องเขียนขึ้นเอง
             ; FUNCTION main (END)

ORG 0000H=แอดเดรสเริ่มต้นถ้าไม่กำหนดจะเริ่มที่แอดเดรส0
MOV    m,#02H     ;เอาค่า2ไปใส่ไว้ในสัญญลักษณ์ m
MOV     n,#03H     ;เอาค่า3ไปใส่ไว้ในสัญญลักษณ์ n
MOV     A,m   ;เอาค่าในสัญญลักษณ์m ไปเก็บไว้ในรีจิสเตอร์A
ADD     A,n        ;ค่าในรีจิสเตอร์A บวกกับค่าในสัญญลักษณ์n
                         ผลลัพธ์เก็บในรีจิสเตอร์A
MOV    o,A      ;เอาค่าในAไปเก็บไว้ในสัญญลักษณ์ o                            
RET  ;กลับไปบรรทัดเริ่มต้นหรือบรรทัดที่ทำงานค้างไว้                                           
END       ;จบ    
                      ; FUNCTION main (END)

ORG,EQU,END=คำสั่งเทียม(Pseudo code)
    คือคำสั่งสำหรับแอสเซมเบลอร์ (Assemble Directive Code)
    หมายความว่าเป็นคำสั่งที่ASSEMBLERรู้จัก
    แต่ไมโครคอนโทรลเลอร์ไม่รู้จัก
    ดังนั้นคำสั่งเทียมจึงไม่มีการกินพื้นที่ROMและRAM
ORG=ORIGIN=กำหนดแอดเดรสเริ่มต้นการทำงานของ   
     โปรแกรม ถ้าไม่มีจะเริ่มต้นทีแอดเดรส 0
EQU=EQUATEแปลว่าเท่ากับ,
    หมายความว่ากำหนดชื่อแทนที่อยู่(ADDRESS)
    เพื่อให้จดจำได้ง่าย
END=จบโปรแกรม หลังจากคำสั่งEND
    ASSEMBLERจะไม่เอาส่วนนี้ไปคอมไพล์
; =เครื่องหมายเซมิโคลอน=คำอธิบาย(COMMENT)
    หมายความว่าASSEMBLERจะไม่เอาส่วนนี้ไปคอมไพล์
# = ค่า(VALUE)
, = เครื่องหมายCOMMA ทำหน้าที่คั่นคำสั่ง

MOV=MOVE=ย้าย
A=REGISTER,ACCUMULATOR
    หมายความว่าเป็นตัวดำเนินการทางคณิตศาสตร์และลอจิก
    เช่น+ - * / OR AND แล้วเก็บค่าไว้ใน Aแต่เก็บได้แค่8บิท

ไม่มีความคิดเห็น: