บทนำ
- ยินดีต้อนรับสู่บทเรียนภาษาแอสเซมบลีของ FFmpeg บทเรียนนี้จะปูพื้นฐานเกี่ยวกับการเขียนภาษาแอสเซมบลีใน FFmpeg
ความรู้ที่จำเป็น
- จำเป็นต้องมีความรู้ภาษา C โดยเฉพาะเรื่องพอยน์เตอร์
- จำเป็นต้องมีความรู้คณิตศาสตร์ระดับมัธยมปลาย เช่น สเกลาร์และเวกเตอร์ การบวก การคูณ เป็นต้น
ภาษาแอสเซมบลีคืออะไร?
- ภาษาแอสเซมบลีคือภาษาการเขียนโปรแกรมที่เขียนโค้ดซึ่งสอดคล้องโดยตรงกับคำสั่งที่ CPU ประมวลผล
- โค้ดแอสเซมบลีส่วนใหญ่ของ FFmpeg เป็นแบบ SIMD (Single Instruction Multiple Data) ซึ่งเรียกอีกอย่างว่าเวกเตอร์โปรแกรมมิง
- SIMD เหมาะสำหรับการประมวลผลข้อมูลจำนวนมากที่เก็บเรียงต่อกันในหน่วยความจำ เช่น ภาพ วิดีโอ และเสียง
ทำไมจึงเขียนด้วยภาษาแอสเซมบลี?
- เพื่อเพิ่มความเร็วในการประมวลผลมัลติมีเดีย การเขียนเป็นแอสเซมบลีสามารถเพิ่มความเร็วได้มากกว่า 10 เท่า
- ใน FFmpeg จะเขียนโค้ดแอสเซมบลีโดยตรงแทนการใช้ intrinsic โดยทั่วไป intrinsic จะช้ากว่าแอสเซมบลีที่เขียนด้วยมือราว 10-15%
ประเภทของภาษาแอสเซมบลี
- บทเรียนนี้มุ่งเน้นที่ภาษาแอสเซมบลี x86 แบบ 64 บิต ซึ่งรู้จักกันในชื่อ amd64 และทำงานได้บน Intel CPU เช่นกัน
- ไวยากรณ์แอสเซมบลี x86 มีสองแบบคือ AT&T และ Intel และจะใช้ไวยากรณ์แบบ Intel
เอกสารประกอบ
- การเขียนโปรแกรมแอสเซมบลีของ FFmpeg มุ่งเน้นการประมวลผลภาพประสิทธิภาพสูงและมีแนวทางที่เป็นเอกลักษณ์
- ไดอะแกรมจากหนังสือ "The Art of 64-bit assembly" อาจช่วยได้
รีจิสเตอร์
- รีจิสเตอร์คือพื้นที่ใน CPU ที่ใช้ประมวลผลข้อมูล CPU จะไม่จัดการหน่วยความจำโดยตรง แต่จะโหลดข้อมูลเข้ารีจิสเตอร์ ประมวลผล แล้วจึงเขียนกลับไปยังหน่วยความจำ
รีจิสเตอร์อเนกประสงค์
- รีจิสเตอร์อเนกประสงค์ (GPR) สามารถเก็บข้อมูลหรือที่อยู่หน่วยความจำได้ ในโค้ดแอสเซมบลีของ FFmpeg นั้น GPR ทำหน้าที่เป็นฐานรองรับเป็นหลัก
เวกเตอร์รีจิสเตอร์
- เวกเตอร์รีจิสเตอร์ (SIMD) เก็บองค์ประกอบข้อมูลได้หลายตัว และมีเวกเตอร์รีจิสเตอร์หลายประเภท
- การคำนวณส่วนใหญ่ของการบีบอัดและคลายการบีบอัดวิดีโอเป็นแบบจำนวนเต็ม
การ include x86inc.asm
- x86inc.asm เป็นเลเยอร์นามธรรมแบบเบาที่ใช้ใน FFmpeg, x264 และ dav1d เพื่อช่วยให้งานของโปรแกรมเมอร์แอสเซมบลีง่ายขึ้น
โค้ดแอสเซมบลีสเกลาร์แบบง่าย
- อธิบายการทำงานของโค้ดแอสเซมบลีสเกลาร์ผ่านโค้ดตัวอย่าง
ทำความเข้าใจฟังก์ชันเวกเตอร์พื้นฐาน
- อธิบายความหมายของแต่ละบรรทัดผ่านตัวอย่างฟังก์ชัน SIMD แรก
- ใช้คำสั่งอย่าง
movu, paddb เพื่อดำเนินการเวกเตอร์
- ฟังก์ชันจะแก้ไขข้อมูลของอาร์กิวเมนต์และไม่ส่งคืนค่า
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
มีแหล่งข้อมูลอีกชิ้นในหัวข้อเดียวกันคือกรณีศึกษาของ FFmpeg และ dav1d
คิดว่าการใช้ intrinsic น่าจะมีคุณค่ามากกว่าการเขียน assembly เอง แต่การอ่านเรื่องนี้มีประโยชน์มาก
คิดว่าคู่มือนี้ยอดเยี่ยมมาก
สงสัยว่าการเรียนหรือการลงมือทำ assembly มี "ความสนุก" อยู่ในตัวหรือไม่
คำต่อท้าย "q" บ่งบอกขนาดของพอยน์เตอร์ ซึ่งบนระบบ 64 บิตคือ 8
ชื่นชมการอ้างอิงถึง K&R
ข้อเสียของการใช้ assembly คือโค้ดผูกติดกับสถาปัตยกรรม
ความไม่เห็นด้วยกับ inline assembly ทำให้สับสน
เนื้อหานี้สมบูรณ์แบบ
สงสัยว่ายังจริงอยู่ไหมที่ assembly เร็วกว่า C ถึง 10 เท่า