ข้ามไปที่เนื้อหาหลัก

รวมชุดคำสั่ง Assembly ของ AVR

บทความนี้ได้รวบรวมชุดคำสั่งภาษา 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

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

Python: Chat bot &Text to Speech ภาษาไทย ด้วย gTTS

วันนี้จะมาแนะนำทุกๆ คนเกี่ยวกับ การเขียนโปรแกรมง่าย ๆ เพื่อให้คอมพิวเตอร์อ่านออกเสียงตามที่เราได้พิมพ์ให้ โดย ใช้ library คือ gTTS และ play sound จะมีวิธีการเขียนอย่างไร มาดูกันเลย เริ่มจากติดตั้ง package gTTS และ play sound ก่อน                                                                          pip install gTTS                                                                                pip install playsound                                                    ...

การทำ Performance Testing ด้วย Postman

Performance Test คืออะไร? Performance Test คือการทดสอบซอฟต์แวร์หรือระบบ เพื่อประเมินความสามารถในการทำงานเมื่อมีภาระหรือโหลดต่างๆ เข้ามาในระบบ เช่น จำนวนผู้ใช้ที่เพิ่มขึ้น, ปริมาณข้อมูลที่ถูกประมวลผล หรือความซับซ้อนในการทำงานของระบบ เหตุผลที่ต้องทำ Performance Test วัดความเร็วของระบบ (Speed) ช่วยให้ทราบว่าระบบสามารถตอบสนองต่อการร้องขอ (request) ได้เร็วเพียงใดในสภาวะการใช้งานที่หลากหลาย ไม่ว่าจะเป็นเมื่อมีผู้ใช้จำนวนน้อยหรือมาก ประเมินความเสถียร (Stability) ตรวจสอบว่าระบบสามารถทำงานได้ต่อเนื่องภายใต้การทำงานหนักหรือโหลดที่สูง เช่นในช่วงที่มีจำนวนผู้ใช้เพิ่มขึ้นอย่างมาก หรือในสถานการณ์ที่ต้องประมวลผลข้อมูลจำนวนมาก ปรับปรุงประสิทธิภาพ (Optimization) ช่วยให้ระบุจุดอ่อนของระบบ เช่น API ที่ทำงานช้า หรือการใช้ทรัพยากรมากเกินไปในบางส่วน ซึ่งสามารถปรับปรุงได้เพื่อเพิ่มประสิทธิภาพ เตรียมพร้อมสำหรับการใช้งานจริง (Real-World Readiness) การทดสอบช่วยให้เราทราบถึงการตอบสนองของระบบในสภาวะที่ใกล้เคียงกับการใช้งานจริง เพื่อให้มั่นใจว่าเมื่อปล่อยระบบให้ผู้ใช้ใช้งาน จะไม่เกิดปัญหาการโหลด...

การทำ Vulnerability Scanning ด้วย ZAP ( Zed Attack Proxy )

Vulnerability Scanning (การสแกนหาช่องโหว่) Vulnerability Scanning คือกระบวนการตรวจสอบระบบโดยอัตโนมัติเพื่อค้นหาช่องโหว่ด้านความปลอดภัย เช่น การตั้งค่าที่ผิดพลาด, ซอฟต์แวร์ที่ล้าสมัย หรือโค้ดที่อาจมีปัญหา ลักษณะของ Vulnerability Scanning ใช้ เครื่องมืออัตโนมัติ เช่น OWASP ZAP, Nessus, OpenVAS มุ่งเน้นการ ระบุช่องโหว่ที่มีอยู่ แต่ไม่ทำการโจมตีเพื่อทดสอบ มีการจัดอันดับความร้ายแรงของช่องโหว่ เช่น Low, Medium, High, Critical สามารถใช้ ทำซ้ำได้ง่าย และเหมาะสำหรับการตรวจสอบ Compliance (มาตรฐานความปลอดภัย) ตัวอย่างช่องโหว่ที่ตรวจพบ การตั้งค่าที่ไม่ปลอดภัย (Security Misconfigurations) การเปิดใช้โปรโตคอลที่ล้าสมัย เช่น TLS 1.0 ซอฟต์แวร์ที่ไม่ได้รับการอัปเดต ช่องโหว่ในโค้ด เช่น SQL Injection, XSS OWASP ZAP (Zed Attack Proxy) เป็นเครื่องมือโอเพนซอร์สที่ถูกพัฒนาโดย OWASP (Open Web Application Security Project) สำหรับการทำ Security Testing โดยเฉพาะการตรวจสอบช่องโหว่ (Vulnerability Assessment) ใน เว็บแอปพลิเคชัน โดย ZAP ทำหน้าที่เป็น Proxy Server ที่ดักจับและวิเคราะ...