แอสเซมเบลอร์ หรือ ภาษาแอสเซมบลี เป็นภาษาการเขียนโปรแกรมระดับต่ำที่ให้การแทนที่เป็นสัญลักษณ์ของคำสั่งรหัสเครื่องของคอมพิวเตอร์ แตกต่างจากภาษาการเขียนโปรแกรมระดับสูงที่ทำให้รายละเอียดของฮาร์ดแวร์ซับซ้อนน้อยลง ภาษาแอสเซมบลีช่วยให้นักพัฒนาสามารถเขียนโปรแกรมที่สอดคล้องใกล้ชิดกับสถาปัตยกรรมของคอมพิวเตอร์ ซึ่งทำให้ผู้พัฒนาสามารถควบคุมทรัพยากรฮาร์ดแวร์ได้อย่างละเอียด ทำให้มันเป็นสิ่งจำเป็นสำหรับงานที่ต้องการการโต้ตอบโดยตรงกับฮาร์ดแวร์หรือการจัดการฮาร์ดแวร์ เช่น ระบบปฏิบัติการ ระบบฝังตัว และแอปพลิเคชันที่มีความสำคัญด้านประสิทธิภาพ
ภาษาแอสเซมบลีเกิดขึ้นในช่วงแรกของการคอมพิวเตอร์เพื่อทำให้กระบวนการเขียนโปรแกรมโดยใช้รหัสเครื่องไบนารีง่ายขึ้น แอสเซมเบลอร์ตัวแรกถูกสร้างขึ้นสำหรับ Electronic Numerical Integrator and Computer (ENIAC) ในปี 1940 ซึ่งช่วยให้นักพัฒนาสามารถเขียนคำสั่งในรูปแบบที่อ่านได้ง่ายขึ้น เมื่อสถาปัตยกรรมคอมพิวเตอร์พัฒนาไป ภาษาแอสเซมบลีก็พัฒนาตามไปด้วย โดยมีการพัฒนาแอสเซมเบลอร์ที่แตกต่างกันเพื่อตอบสนองต่อการออกแบบฮาร์ดแวร์ที่หลากหลาย
แอสเซมเบลอร์ได้รับแรงบันดาลใจโดยตรงจากสถาปัตยกรรมของคอมพิวเตอร์เฉพาะที่มันมุ่งเป้าไปที่แต่ละประเภทของโปรเซสเซอร์มีภาษาแอสเซมบลีของตนเอง เช่น x86 (สำหรับโปรเซสเซอร์ Intel และ AMD), ARM (ที่ใช้กันอย่างแพร่หลายในอุปกรณ์มือถือ) และ MIPS (ที่ใช้ในระบบฝังตัว) แม้ว่าภาษาแอสเซมบลีจะแบ่งปันแนวคิดพื้นฐานบางประการ แต่ก็สะท้อนถึงชุดคำสั่งและความสามารถในการทำงานที่เป็นเอกลักษณ์ของแพลตฟอร์มฮาร์ดแวร์ของตน
ในปัจจุบัน แม้ว่า ภาษาแอสเซมบลีจะไม่ใช่ภาษาหลักสำหรับการพัฒนาแอปพลิเคชัน แต่ก็ยังคงมีความเกี่ยวข้องในบางโดเมน โดยทั่วไปจะใช้ในการเขียนส่วนที่มีความสำคัญด้านประสิทธิภาพของโค้ด ไดรเวอร์อุปกรณ์ และระบบเรียลไทม์ นอกจากนี้ การเข้าใจภาษาแอสเซมบลีเป็นสิ่งสำคัญสำหรับสาขาต่าง ๆ เช่น การวิศวกรรมย้อนกลับ การวิเคราะห์มัลแวร์ และความปลอดภัยของระบบ
แอสเซมเบลอร์ใช้คำจำกัดความ ซึ่งเป็นการแทนที่เป็นสัญลักษณ์ของคำสั่งเครื่อง ตัวอย่างเช่น MOV AX, 1
แทนการย้ายค่า 1
ไปยังรีจิสเตอร์ AX
ภาษาแอสเซมบลีอนุญาตให้มีการจัดการรีจิสเตอร์ของโปรเซสเซอร์โดยตรง ตัวอย่างเช่น คำสั่ง ADD AX, BX
จะบวกค่าที่อยู่ในรีจิสเตอร์ AX
และ BX
และเก็บผลลัพธ์ไว้ใน AX
ป้ายกำกับใช้เพื่อทำเครื่องหมายตำแหน่งในโค้ดสำหรับการกระโดดและลูป ป้ายกำกับอาจมีลักษณะเช่น start:
ซึ่งมีประโยชน์สำหรับการสร้างลูปด้วยคำสั่งเช่น JMP start
คำสั่งควบคุมพฤติกรรมของแอสเซมเบลอร์และให้ข้อมูลเมตา ตัวอย่างเช่น คำสั่ง .data
และ .text
ระบุส่วนสำหรับข้อมูลและโค้ดตามลำดับ
สามารถรวมความคิดเห็นเพื่อวัตถุประสงค์ในการจัดทำเอกสารโดยใช้เครื่องหมายเซมิโคลอน ตัวอย่างเช่น ; นี่คือความคิดเห็น
ภาษาแอสเซมบลีสนับสนุนคำสั่งควบคุมการไหล เช่น JMP
, JE
(กระโดดถ้าเท่ากัน) และ JNE
(กระโดดถ้าไม่เท่ากัน) ซึ่งช่วยให้สามารถแยกสาขาในการดำเนินการโค้ด
แต่ละคำสั่งแอสเซมบลีมักประกอบด้วยการดำเนินการ (opcode) ตามด้วยออปแรนดส์ การดำเนินการสามารถเป็นแบบยูนาร์ บายเนอรี หรือใช้รูปแบบที่ซับซ้อนมากขึ้นขึ้นอยู่กับสถาปัตยกรรมชุดคำสั่ง
ภาษาแอสเซมบลีอนุญาตให้ใช้ค่าทันทีโดยตรงในคำสั่ง เช่น MOV AX, 5
ซึ่ง 5
เป็นค่าทันทีที่กำหนดให้กับรีจิสเตอร์ AX
ภาษาแอสเซมบลีสนับสนุนการเรียกขั้นตอนและฟังก์ชันย่อย ซึ่งช่วยให้สามารถใช้โค้ดซ้ำได้ สามารถเรียกใช้ได้โดยใช้คำสั่ง CALL
ตามด้วยป้ายกำกับ เช่น CALL myFunction
แม้ว่าแอสเซมบลีจะไม่มีประเภทข้อมูลระดับสูง แต่ข้อมูลสามารถจัดการได้โดยใช้ไบต์ คำ หรือดับเบิลเวิร์ดตามสถาปัตยกรรม และที่อยู่หน่วยความจำสามารถจัดการได้โดยตรง
แอสเซมเบลอร์จะแปลงโค้ดภาษาแอสเซมบลีเป็นรหัสเครื่อง แอสเซมเบลอร์ที่หลากหลายมีอยู่ เช่น NASM (Netwide Assembler), MASM (Microsoft Macro Assembler) และ GAS (GNU Assembler) ซึ่งแต่ละตัวมุ่งเป้าไปที่สถาปัตยกรรมหรือระบบปฏิบัติการเฉพาะ
สภาพแวดล้อมการพัฒนาสำหรับภาษาแอสเซมบลีมีน้อยกว่าภาษาในระดับสูง แต่รวมถึง IDE เฉพาะเช่น MPLAB X IDE สำหรับไมโครคอนโทรลเลอร์ PIC หรือ Keil สำหรับการพัฒนา ARM
ในการสร้างโปรเจกต์ในภาษาแอสเซมบลี นักพัฒนามักจะเขียนโค้ดต้นฉบับในโปรแกรมแก้ไขข้อความ จากนั้นเรียกใช้แอสเซมเบลอร์ผ่านบรรทัดคำสั่งเพื่อสร้างไฟล์ไบนารีหรือไฟล์วัตถุ ตัวอย่างเช่น การใช้ NASM คำสั่งทั่วไปอาจมีลักษณะดังนี้:
nasm -f elf64 myprogram.asm -o myprogram.o
ถัดไป การเชื่อมโยงสามารถทำได้โดยใช้ลิงเกอร์เช่น ld
เพื่อสร้างไฟล์ที่สามารถเรียกใช้ได้:
ld myprogram.o -o myprogram
ภาษาแอสเซมบลีถูกใช้ในพื้นที่ที่ต้องการประสิทธิภาพที่ปรับให้เหมาะสมและการจัดการฮาร์ดแวร์โดยตรง การใช้งานหลัก ได้แก่:
แตกต่างจากภาษาระดับสูงเช่น C, C++ หรือ Java ซึ่งเสนอการทำให้เป็นนามธรรมเหนือฮาร์ดแวร์ ภาษาแอสเซมบลีให้การควบคุมโดยตรงต่อคำสั่งเครื่อง ซึ่งทำให้โปรแกรมแอสเซมบลีโดยทั่วไปเร็วกว่าและมีขนาดเล็กกว่า ซึ่งเป็นสิ่งสำคัญในสภาพแวดล้อมที่มีข้อจำกัดด้านทรัพยากร แต่มีความสามารถในการพอร์ตน้อยลงอย่างมีนัยสำคัญ
แม้ว่าการปรับแต่งภาษาแอสเซมบลีสามารถให้ประสิทธิภาพที่เหนือกว่า แต่ภาษาต่าง ๆ เช่น C และ C++ ทำให้กระบวนการพัฒนาง่ายขึ้นอย่างมาก ภาษาในระดับสูงจัดการการจัดการหน่วยความจำ การตรวจสอบข้อผิดพลาด และให้ห้องสมุดที่กว้างขวาง ทำให้เหมาะสำหรับแอปพลิเคชันส่วนใหญ่
ไวยากรณ์ของภาษาแอสเซมบลีถือว่ามีความซับซ้อนมากกว่าภาษาเช่น Python หรือ JavaScript ซึ่งให้ความสำคัญกับความสามารถในการอ่านและความสะดวกในการใช้งาน การเรียนรู้แอสเซมบลีต้องการความเข้าใจเกี่ยวกับสถาปัตยกรรมคอมพิวเตอร์ ในขณะที่ภาษาระดับสูงทำให้รายละเอียดเหล่านี้ซับซ้อนน้อยลง
มีเครื่องมือหลายอย่างที่มีอยู่สำหรับการแปลภาษาระดับสูงเป็นภาษาแอสเซมบลีหรือทำให้ภาษาแอสเซมบลีสามารถโต้ตอบกับโค้ดระดับสูงได้ แอสเซมเบลอร์บางตัวสามารถรวมโค้ด C โดยตรง ทำให้สามารถสร้างโปรเจกต์แบบผสมได้ เครื่องมือเช่น LLVM ยังสามารถสร้างภาษาแอสเซมบลีจากโค้ดที่เขียนในภาษาระดับสูง
สำหรับนักพัฒนาที่ต้องการแปลงโค้ดจากภาษาระดับสูงเป็นภาษาแอสเซมบลี การศึกษาชุดคำสั่งของสถาปัตยกรรมเป้าหมายและการใช้เครื่องมือการวิเคราะห์ประสิทธิภาพเพื่อชี้นำความพยายามในการปรับแต่งจะเป็นประโยชน์ นอกจากนี้ยังแนะนำให้ใช้คอมไพเลอร์ที่มีอยู่เช่น GCC ที่สามารถส่งออกโค้ดแอสเซมบลีเพื่อการวิเคราะห์หรือการปรับปรุงเพิ่มเติม