บทนำ

     พูดอย่างกว้างๆ คุณสามารถแบ่งภาษาได้สี่กลุ่ม ต่ำสุดคือ machine code จำนวนตัวเลขดิบๆ ที่สามารถถอดรหัส ชุดคำสั่งได้และทำงาน หนึ่งก้าว คือ assembly มีความจำเป็นต่อ machine code แต่ละคำสั่งของ assembly พิจารณาเป็นหนึ่งชุด machine code ทั้งหมดที่กล่าวเหมือนโปรแกรมที่ compile แล้วของภาษา C  C ใช้โครงสร้างภาษาที่มนุษย์ สามารถอ่านได้เหมือนภาษาอังกฤษ แต่ต้อง compile เป็น machine code เพื่อรัน สุดท้ายมีภาษา script อย่างเช่น PHP เหมือน VB JAVA  มี interpreter ปรับแต่งละรัน machine code ที่ถูกต้อง

    ทุกๆความก้าวหน้าเป็นผลดีต่อความเข้าใจและเป็นภาษามนุษย์ที่อ่านได้และยึดหยุ่น การใช้เวลารันและขนาดโปรแกรมในสมัยเก่าโปรแกรมเมอร์คือผู้ควบคุมโปรแกรมจริงๆทำและให้ machine code ทำงานได้ตามข้อจำกัดของ clock speed และ memory สำหรับ PC ถูกจัดการและทำงานได้โดยองค์ประกอบของภาษาระดับสูง เป็นสิ่งที่ดีเพราะเขียนได้รวดเร็วและจัดการง่าย

อย่างไรก็ตาม ภาษาระดับสูง ข้อจำกัดบางอย่างที่ยังไม่สามารถทำได้เพียงพอ Gameboy ด้วย CPU 16.7MHz RAM น้อยกว่า 1MB ทำงานได้ภาษาสูงอาจจะไม่มีประสิทธิภาพเพียงพอ ไม่สามารถรันได้ทั้งหมด ทำไม Gameboy ทำได้งานใน C/C++ บางครั้งด้วยความเสน่หาเรียกภาษานี้ว่า portable assembly เพราะมันสามารถเข้าถึง memory ได้โดยตรง แต่ยังมีบางอย่างที่ไม่เพียงพอ จริงๆถ้าคุณต้องการจะทำทุกๆอย่างตามการนับ cycle ของ CPU อาจจะตัองการใช้ assembly ในการเขียน

   ตอนนี้ในบางกลุ่มเรียก assembly คือภาษาโปรแกรมที่เล็กที่สุด เพราะใกล้ชิดและผูกกับ CPU คุณสามารถทำได้ทุกอย่าง และต้องจัดการทุกอย่างทั้งหมด คุณอยู่ใกล้ hardware คุณสามารถลัดขั้นตอนคุณสมบัติที่ป้องกันความปลอดภัยของภาษาระดับสูงได้ อาจจะทำงานง่ายต่อการทำลายและอันตรายมากขึ้น เหมือนอยู่ในโลกของการผจญภัย

    โปรแกรม assembly คุณต้องรู้และเข้าใจว่า CPU ทำงานอย่างไรถึงจะเขียนโปรแกรมได้ มากกว่าการแปลผลจาก complier และ interpreter ไม่มีโครงสร้าง while loop หรือ กิ่ง if/else มีแค่ goto ไม่มีโครงสร้างคลาสและการสืบทอด ไม่มีแปลชนิดข้อมูล สิ่งเหล่านี้ทำให้ code สามารถรันได้เร็วทีสุดเท่าที่เป็นไปได้

   ความเร็วและขนาดโปรแกรมเป็นประเด็นหนึ่ง ไม่มีเหตุผลอื่นที่ว่าทำไมไม่เรียนรู้ assembly เพราะสามารถทำได้ดี สามารถอธิบายให้คุณทราบการทำงานของ CPU function และคุณสามารถใช้ความรู้ในภาษาซีได้เหมือนกัน ตัวอย่างที่ดีทีสุดของชนิดของข้อมูลคือ int เพราะ ARM processor คือ32 bit ถูกให้ใช้มากกว่าทุกๆสิ่ง เพราะชนิดข้อมูลอื่นจะช้าลง และบ้างครั้งช้ามาก เป็นพื้นฐานของ CPU และความรู้ทางภาษา assembly จะแสดงให้ว่าทำไมช้าลง

   ทุกอย่างๆ ที่เกี่ยวกับบทนี้ เอกสารแนะนำที่เกี่ยวกับ assembly ที่สมบูรณ์ คงหนีไม่พ้น คู่มือ CPU ฉบับเต็ม สิ่งสำคัญอยากให้เน้นไปที่ชุดคำสั่ง ARM และ Thumb รวมไปถึงอยากให้ดูการใช้งาน GCC assembler เครื่องที่สามารถสร้าง C และ assembly ไปพร้อมๆกัน เอกสารที่เตรียมศึกษามีดังต่อไปนี้

ทำความรู้จัก CPU ทางกายภาพ 

สรุปชุดคำสั่งของ Thumb และ ARMแบบคร่าวๆ

ชุดคำสั่งหลัก GAS /ARM/ Thumb2

คู่มือการใช้ GNU assembler

  หลายคนอาจจะงงว่า ทำไม ARM มี ชุดคำสั่ง Thumb ด้วย จุดมุ่งหมายของชุดคำสั่ง Thumb เป็นรูปพิเศษบีบอัดชุดคำสั่งให้น้อยลง เพื่อให้ opcode ที่ใช้ใน memory น้อยลง ลดการเปรียบเทียบลงในแต่ละคำสั่งของการทำงาน มีหลายแบบแตกต่างกันไปตามสถาปัตยกรรม series ของ ARM อาทิ เช่น Thumb Thumb2  ThumbEE ส่วนชุดคำสั่ง ARM นั้นเป็นคำสั่งทั่วไปของ ARM

  ปกติแล้วใน CPU จะมีส่วนสำคัญคือ register หน่วยความจำที่ไว้พักข้อมูลอ่านเขียนเร็วที่สุด เพื่อใช้คำนวณ ส่วน ALU คือหน่วยประมวลทางคณิตศาสตร์  หลักการรันชุดคำสั่งสรุปได้ดังแผนภาพ