บทความนี้ได้รวบรวมชุดคำสั่งภาษา assembly ของไมโคคอนโทรลเลอร์ตระกูล AVR และสรุปการใช้งานเป็นภาษาไทยอย่างง่ายหากมีข้อผิดพลาด ขออภัยด้วยครับ
ชุดคำสั่งทางคณิตศาสตร์และลอจิก
add Rd, Rr : Rd + Rr เก็บผลลัพธ์ไว้ใน Rd
adc Rd, Rr : Rd + Rr + Carry flag เก็บผลลัพธ์ไว้ใน Rd
mul Rd, Rr : Rd x Rr ได้ผลลัพธ์เป็น 16 bit เก็บไว้ใน R0, R1
sub Rd, Rr : Rd - Rr เก็บผลลัพธ์ไว้ใน Rd
sbc Rd, Rr : Rd - Rr - Carry flag เก็บผลลัพธ์ไว้ใน Rd
and Rd, Rr : Rd and Rr แบบ bit ต่อ bit
or Rd, Rr : Rd or Rr แบบ bit ต่อ bit
eor Rd, Rr : Rd exclusive or Rr แบบ bit ต่อ bit
com Rd : complement (กลับบิต) Rd
neg Rd : 2'complement (ติดลบ) Rd
inc Rd : Rd++
dec Rd : Rd--
clr Rd : เคลียร์ bit Rd เป็น 0
ชุดคำสั่งเคลื่อนย้ายข้อมูล
mov Rd, Rr : copy ข้อมูลขนาด 1 byte จาก Rr ไว้ใน Rd
movw Rd, Rr : copy ข้อมูลขนาด 2 bytes จาก Rr, Rr+1 ไว้ใน Rd, Rd+1
ldi Rd, k : โหลดค่าใส่ register , k มีค่า 0 - 255
ld Rd, X : อ่านค่าตำแหน่งที่ X ชี้อยู่เก็บไว้ใน Rd
ld Rd, Y : อ่านค่าตำแหน่งที่ Y ชี้อยู่เก็บไว้ใน Rd
ld Rd, Z : อ่านค่าตำแหน่งที่ Z ชี้อยู่เก็บไว้ใน Rd
ld Rd, -X : อ่านค่าตำแหน่งที่ X-1 ชี้อยู่เก็บไว้ใน Rd
ld Rd, -Y : อ่านค่าตำแหน่งที่ Y-1 ชี้อยู่เก็บไว้ใน Rd
ld Rd, -Z : อ่านค่าตำแหน่งที่ Z-1 ชี้อยู่เก็บไว้ใน Rd
ld Rd, X+ : อ่านค่าตำแหน่งที่ X ชี้อยู่เก็บไว้ใน Rd จากนั้น X เลื่อนไป 1 ตำแหน่ง
ld Rd, Y+ : อ่านค่าตำแหน่งที่ Y ชี้อยู่เก็บไว้ใน Rd จากนั้น Y เลื่อนไป 1 ตำแหน่ง
ld Rd, Z+ : อ่านค่าตำแหน่งที่ Z ชี้อยู่เก็บไว้ใน Rd จากนั้น Z เลื่อนไป 1 ตำแหน่ง
st X, Rd : เขียนข้อมูลจาก Rd ลงไปใน SRAM ตำแหน่งที่ X ชี้อยู่
st Y, Rd : เขียนข้อมูลจาก Rd ลงไปใน SRAM ตำแหน่งที่ Y ชี้อยู่
st Z, Rd : เขียนข้อมูลจาก Rd ลงไปใน SRAM ตำแหน่งที่ Z ชี้อยู่
st -X, Rd : เขียนข้อมูลจาก Rd ลงไปใน SRAM ตำแหน่งที่ X-1 ชี้อยู่
st -Y, Rd : เขียนข้อมูลจาก Rd ลงไปใน SRAM ตำแหน่งที่ Y-1 ชี้อยู่
st -Z, Rd : เขียนข้อมูลจาก Rd ลงไปใน SRAM ตำแหน่งที่ Z-1 ชี้อยู่
st X+, Rd : เขียนข้อมูลจาก Rd ลงไปใน SRAM ตำแหน่งที่ X ชี้อยู่จากนั้น X เลื่อนไป 1 ตำแหน่ง
st Y+, Rd : เขียนข้อมูลจาก Rd ลงไปใน SRAM ตำแหน่งที่ Y ชี้อยู่จากนั้น Y เลื่อนไป 1 ตำแหน่ง
st Z+, Rd : เขียนข้อมูลจาก Rd ลงไปใน SRAM ตำแหน่งที่ Z ชี้อยู่จากนั้น Z เลื่อนไป 1 ตำแหน่ง
lpm : อ่านค่าจาก SRAM ตำแหน่งที่ Z ชี้อยู่เก็บไว้ใน R0
in Rd, A : อ่านค่าจาก Input Address A ไปเก็บใน Rd (Input Address เช่น PINB, PINC, PIND)
out A, Rr : ส่งค่าข้อมูลจาก Rr ไปยัง Output Address A (Output Address เช่น PORTB, PORTC, PORTD)
push Rr : เก็บค่า Rr ไว้ใน Stack
pop Rd : นำค่าบนสุดของ Stack มาเก็บไว้ใน Rd
ชุดคำสั่งควบคุมการทำงานของ CPU
nop : No Operand คือไม่ทำอะไรเลย 1 clk
sleep : เข้าสู่โหมดประหยัดพลังงาน
wdr : รีเซ็ต watch dog timer
ชุดคำสั่งควบคุมการทำงานของโปรแกรม
call SUB_ROUTINE : เรียกใช้ sub-rutine ที่ประกาศไว้
ret : กลับไปทำงานโปรแกรมจากตำแหน่งที่เรียกใช้ sub-rutine จะใช้ใน sub-rutine
rjmp ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้ กระโดดได้ไม่เกิน +- 2K ตำแหน่งจากตำแหน่งปัจจุบัน
jmp ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้ กระโดดได้ทั่วทุกตำแหน่งของหน่วยความจำ
cp Rd, Rr : เปรียบเทียบ Rd และ Rr ใช้คู่กับ Branch
brlt ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หากผลการเปรียบเทียบ Rd < Rr แบบคิดเครื่องหมาย
brlo ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หากผลการเปรียบเทียบ Rd < Rr แบบไม่คิดเครื่องหมาย
brge ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หากผลการเปรียบเทียบ Rd >= Rr
brcs ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หาก carry flag เท่ากับ 1
brcc ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หาก carry flag เท่ากับ 0
brhs ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หาก half carry flag เท่ากับ 1
brhc ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หาก half carry flag เท่ากับ 0
brvs ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หาก overflow flag เท่ากับ 1
brvc ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หาก overflow flag เท่ากับ 0
cpi Rd, k : เปรียบเทียบ Rd กับ k ใช้คู่กับ Branch โดย k เป็นค่าคงที่ เช่น 1, 2, 3
breq ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หากผลการเปรียบเทียบเท่ากัน
brne ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หากผลการเปรียบเทียบไม่เท่ากัน
ชุดคำสั่งจัดการข้อมูลระดับ bit
lsl Rd : ชิพบิตไปทางซ้าย 1 ครั้ง เก็บบิตซ้ายสุดไว้ที่ carry flag
lsr Rd : ชิพบิตไปทางขวา 1 ครั้ง เก็บบิตขวาสุดไว้ที่ carry flag
rol Rd : ชิพบิตไปทางซ้าย 1 ครั้ง เก็บบิตซ้ายสุดไว้ที่ carry flag แทนที่บิตขวาสุดด้วย carry flag ที่เก็บจากบิตซ้ายสุด
ror Rd : ชิพบิตไปทางขวา 1 ครั้ง เก็บบิตขวาสุดไว้ที่ carry flag แทนที่บิตซ้ายสุดด้วย carry flag ที่เก็บจากบิตขวาสุด
asr Rd : ชิพบิตไปทางขวา 1 ครั้ง เก็บบิตขวาสุดไว้ที่ carry flag บิตซ้ายสุดคงค่าเดิม
swap Rd : สลับ 4 bits ล่างกับ 4 bits บนของ Rd
sec : เซ็ทค่า carry flag เท่ากับ 1
clc : เซ็ทค่า carry flag เท่ากับ 0
sen : เซ็ทค่า negative flag เท่ากับ 1
cln : เซ็ทค่า negative flag เท่ากับ 0
sez : เซ็ทค่า zero flag เท่ากับ 1
clz : เซ็ทค่า zero flag เท่ากับ 0
sev : เซ็ทค่า overflow flag เท่ากับ 1
clv : เซ็ทค่า overflow flag เท่ากับ 0
seh : เซ็ทค่า half carry flag เท่ากับ 1
clh : เซ็ทค่า half carry flag เท่ากับ 0
สามารถศึกษาเพิ่มเติมได้ที่ : http://academy.cba.mit.edu/classes/embedded_programming/doc1022.pdf
ชุดคำสั่งทางคณิตศาสตร์และลอจิก
add Rd, Rr : Rd + Rr เก็บผลลัพธ์ไว้ใน Rd
adc Rd, Rr : Rd + Rr + Carry flag เก็บผลลัพธ์ไว้ใน Rd
mul Rd, Rr : Rd x Rr ได้ผลลัพธ์เป็น 16 bit เก็บไว้ใน R0, R1
sub Rd, Rr : Rd - Rr เก็บผลลัพธ์ไว้ใน Rd
sbc Rd, Rr : Rd - Rr - Carry flag เก็บผลลัพธ์ไว้ใน Rd
and Rd, Rr : Rd and Rr แบบ bit ต่อ bit
or Rd, Rr : Rd or Rr แบบ bit ต่อ bit
eor Rd, Rr : Rd exclusive or Rr แบบ bit ต่อ bit
com Rd : complement (กลับบิต) Rd
neg Rd : 2'complement (ติดลบ) Rd
inc Rd : Rd++
dec Rd : Rd--
clr Rd : เคลียร์ bit Rd เป็น 0
ชุดคำสั่งเคลื่อนย้ายข้อมูล
mov Rd, Rr : copy ข้อมูลขนาด 1 byte จาก Rr ไว้ใน Rd
movw Rd, Rr : copy ข้อมูลขนาด 2 bytes จาก Rr, Rr+1 ไว้ใน Rd, Rd+1
ldi Rd, k : โหลดค่าใส่ register , k มีค่า 0 - 255
ld Rd, X : อ่านค่าตำแหน่งที่ X ชี้อยู่เก็บไว้ใน Rd
ld Rd, Y : อ่านค่าตำแหน่งที่ Y ชี้อยู่เก็บไว้ใน Rd
ld Rd, Z : อ่านค่าตำแหน่งที่ Z ชี้อยู่เก็บไว้ใน Rd
ld Rd, -X : อ่านค่าตำแหน่งที่ X-1 ชี้อยู่เก็บไว้ใน Rd
ld Rd, -Y : อ่านค่าตำแหน่งที่ Y-1 ชี้อยู่เก็บไว้ใน Rd
ld Rd, -Z : อ่านค่าตำแหน่งที่ Z-1 ชี้อยู่เก็บไว้ใน Rd
ld Rd, X+ : อ่านค่าตำแหน่งที่ X ชี้อยู่เก็บไว้ใน Rd จากนั้น X เลื่อนไป 1 ตำแหน่ง
ld Rd, Y+ : อ่านค่าตำแหน่งที่ Y ชี้อยู่เก็บไว้ใน Rd จากนั้น Y เลื่อนไป 1 ตำแหน่ง
ld Rd, Z+ : อ่านค่าตำแหน่งที่ Z ชี้อยู่เก็บไว้ใน Rd จากนั้น Z เลื่อนไป 1 ตำแหน่ง
st X, Rd : เขียนข้อมูลจาก Rd ลงไปใน SRAM ตำแหน่งที่ X ชี้อยู่
st Y, Rd : เขียนข้อมูลจาก Rd ลงไปใน SRAM ตำแหน่งที่ Y ชี้อยู่
st Z, Rd : เขียนข้อมูลจาก Rd ลงไปใน SRAM ตำแหน่งที่ Z ชี้อยู่
st -X, Rd : เขียนข้อมูลจาก Rd ลงไปใน SRAM ตำแหน่งที่ X-1 ชี้อยู่
st -Y, Rd : เขียนข้อมูลจาก Rd ลงไปใน SRAM ตำแหน่งที่ Y-1 ชี้อยู่
st -Z, Rd : เขียนข้อมูลจาก Rd ลงไปใน SRAM ตำแหน่งที่ Z-1 ชี้อยู่
st X+, Rd : เขียนข้อมูลจาก Rd ลงไปใน SRAM ตำแหน่งที่ X ชี้อยู่จากนั้น X เลื่อนไป 1 ตำแหน่ง
st Y+, Rd : เขียนข้อมูลจาก Rd ลงไปใน SRAM ตำแหน่งที่ Y ชี้อยู่จากนั้น Y เลื่อนไป 1 ตำแหน่ง
st Z+, Rd : เขียนข้อมูลจาก Rd ลงไปใน SRAM ตำแหน่งที่ Z ชี้อยู่จากนั้น Z เลื่อนไป 1 ตำแหน่ง
lpm : อ่านค่าจาก SRAM ตำแหน่งที่ Z ชี้อยู่เก็บไว้ใน R0
in Rd, A : อ่านค่าจาก Input Address A ไปเก็บใน Rd (Input Address เช่น PINB, PINC, PIND)
out A, Rr : ส่งค่าข้อมูลจาก Rr ไปยัง Output Address A (Output Address เช่น PORTB, PORTC, PORTD)
push Rr : เก็บค่า Rr ไว้ใน Stack
pop Rd : นำค่าบนสุดของ Stack มาเก็บไว้ใน Rd
ชุดคำสั่งควบคุมการทำงานของ CPU
nop : No Operand คือไม่ทำอะไรเลย 1 clk
sleep : เข้าสู่โหมดประหยัดพลังงาน
wdr : รีเซ็ต watch dog timer
ชุดคำสั่งควบคุมการทำงานของโปรแกรม
call SUB_ROUTINE : เรียกใช้ sub-rutine ที่ประกาศไว้
ret : กลับไปทำงานโปรแกรมจากตำแหน่งที่เรียกใช้ sub-rutine จะใช้ใน sub-rutine
rjmp ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้ กระโดดได้ไม่เกิน +- 2K ตำแหน่งจากตำแหน่งปัจจุบัน
jmp ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้ กระโดดได้ทั่วทุกตำแหน่งของหน่วยความจำ
cp Rd, Rr : เปรียบเทียบ Rd และ Rr ใช้คู่กับ Branch
brlt ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หากผลการเปรียบเทียบ Rd < Rr แบบคิดเครื่องหมาย
brlo ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หากผลการเปรียบเทียบ Rd < Rr แบบไม่คิดเครื่องหมาย
brge ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หากผลการเปรียบเทียบ Rd >= Rr
brcs ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หาก carry flag เท่ากับ 1
brcc ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หาก carry flag เท่ากับ 0
brhs ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หาก half carry flag เท่ากับ 1
brhc ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หาก half carry flag เท่ากับ 0
brvs ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หาก overflow flag เท่ากับ 1
brvc ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หาก overflow flag เท่ากับ 0
cpi Rd, k : เปรียบเทียบ Rd กับ k ใช้คู่กับ Branch โดย k เป็นค่าคงที่ เช่น 1, 2, 3
breq ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หากผลการเปรียบเทียบเท่ากัน
brne ROUTINE : กระโดดไปทำงานตำแหน่งที่ประกาศไว้หากผลการเปรียบเทียบไม่เท่ากัน
ชุดคำสั่งจัดการข้อมูลระดับ bit
lsl Rd : ชิพบิตไปทางซ้าย 1 ครั้ง เก็บบิตซ้ายสุดไว้ที่ carry flag
lsr Rd : ชิพบิตไปทางขวา 1 ครั้ง เก็บบิตขวาสุดไว้ที่ carry flag
rol Rd : ชิพบิตไปทางซ้าย 1 ครั้ง เก็บบิตซ้ายสุดไว้ที่ carry flag แทนที่บิตขวาสุดด้วย carry flag ที่เก็บจากบิตซ้ายสุด
ror Rd : ชิพบิตไปทางขวา 1 ครั้ง เก็บบิตขวาสุดไว้ที่ carry flag แทนที่บิตซ้ายสุดด้วย carry flag ที่เก็บจากบิตขวาสุด
asr Rd : ชิพบิตไปทางขวา 1 ครั้ง เก็บบิตขวาสุดไว้ที่ carry flag บิตซ้ายสุดคงค่าเดิม
swap Rd : สลับ 4 bits ล่างกับ 4 bits บนของ Rd
sec : เซ็ทค่า carry flag เท่ากับ 1
clc : เซ็ทค่า carry flag เท่ากับ 0
sen : เซ็ทค่า negative flag เท่ากับ 1
cln : เซ็ทค่า negative flag เท่ากับ 0
sez : เซ็ทค่า zero flag เท่ากับ 1
clz : เซ็ทค่า zero flag เท่ากับ 0
sev : เซ็ทค่า overflow flag เท่ากับ 1
clv : เซ็ทค่า overflow flag เท่ากับ 0
seh : เซ็ทค่า half carry flag เท่ากับ 1
clh : เซ็ทค่า half carry flag เท่ากับ 0
สามารถศึกษาเพิ่มเติมได้ที่ : http://academy.cba.mit.edu/classes/embedded_programming/doc1022.pdf
ความคิดเห็น
แสดงความคิดเห็น