ภาษาแอสเซมบลี
| ภาษาแอสเซมบลี | |
|---|---|
| กระบวนทัศน์ | ภาษา แอสเซมเบลอร์เป็นแบบเชิงคำสั่งไม่มีโครงสร้างมักใช้เมตาโปรแกรมมิ่ง (ผ่านมาโคร ) แต่บางภาษาก็มีโครงสร้างหรือเป็นแบบเชิงวัตถุ |
| ปรากฏครั้งแรก | 1947 ( 1947 ) |
| วินัยในการพิมพ์ | ไม่มี |
| นามสกุลไฟล์ | .asmรวมถึงตัวเลือกอื่นๆ อีกหลายอย่าง ขึ้นอยู่กับตัวประกอบภาษาแอส.sเซมเบลอร์.S.inc.wla.SRC |
ในการคำนวณภาษาแอสเซมบลี (หรือเรียกอีกอย่างว่าภาษาแอสเซมเบลอร์[ 1 ]หรือรหัสเครื่องเชิงสัญลักษณ์ ) [ 2 ] [ 3 ] [ 4 ]ซึ่งมักเรียกกันง่ายๆ ว่าแอสเซมบลีและโดยทั่วไปย่อว่าASMหรือasmเป็นภาษาโปรแกรมระดับต่ำ ใดๆ ที่มีความสอดคล้องกันอย่างมากระหว่างคำสั่งในภาษาและคำสั่งรหัสเครื่องของสถาปัตยกรรม[ 5 ]ภาษาแอสเซมบลีมักจะมีคำสั่งหนึ่งคำสั่งต่อคำสั่งรหัสเครื่องหนึ่งคำสั่ง (1:1) แต่โดยทั่วไปยังรองรับค่าคงที่ความคิดเห็นคำสั่งแอสเซมเบลอร์[ 6 ] ป้ายกำกับเชิงสัญลักษณ์เช่นตำแหน่งหน่วยความจำรีจิสเตอร์และมาโคร[ 7 ] [ 1 ]ด้วย
รหัสแอสเซมบลีแรกที่ใช้ภาษาเพื่อแสดงคำสั่งรหัสเครื่องพบได้ในงานของKathleenและAndrew Donald Booth ในปี 1947 เรื่อง Coding for ARC [ 8 ] รหัสแอสเซมบลีจะถูกแปลงเป็นรหัสเครื่องที่สามารถเรียกใช้งานได้โดยโปรแกรมยูทิลิตี้ที่เรียกว่าแอสเซมเบลอร์คำว่า "แอสเซมเบลอร์" โดยทั่วไปแล้วมีที่มาจากWilkes , WheelerและGillในหนังสือของพวกเขาในปี 1951 เรื่อง The Preparation of Programs for an Electronic Digital Computer [ 9 ] อย่างไรก็ตามพวกเขาใช้คำนี้ในความหมายว่า "โปรแกรมที่ประกอบโปรแกรมอื่นซึ่งประกอบด้วยหลายส่วนเข้าเป็นโปรแกรมเดียว" [ 10 ]กระบวนการแปลงนี้เรียกว่าแอสเซมบลีเช่นการประกอบรหัสต้นฉบับขั้นตอนการคำนวณเมื่อแอสเซมเบลอร์กำลังประมวลผลโปรแกรมเรียกว่าเวลาแอสเซมบลี
เนื่องจากการประกอบขึ้นอยู่กับคำสั่งรหัสเครื่อง ภาษาการประกอบแต่ละภาษา[ nb 1 ] จึงเฉพาะ เจาะจง กับ สถาปัตยกรรมคอมพิวเตอร์เฉพาะเช่นx86หรือARM [ 11 ] [ 12 ] [ 13 ]
บางครั้งอาจมีแอสเซมเบลอร์มากกว่าหนึ่งตัวสำหรับสถาปัตยกรรมเดียวกัน และบางครั้งแอสเซมเบลอร์ก็เฉพาะเจาะจงกับระบบปฏิบัติการหรือระบบปฏิบัติการบางระบบ ภาษาแอสเซมบลีส่วนใหญ่ไม่ได้ให้ไวยากรณ์ เฉพาะ สำหรับการเรียกใช้ระบบปฏิบัติการ และภาษาแอสเซมบลีส่วนใหญ่สามารถใช้งานได้กับระบบปฏิบัติการใดๆ ก็ได้[หมายเหตุ 2 ]เนื่องจากภาษานี้ให้การเข้าถึงความสามารถที่แท้จริงทั้งหมดของโปรเซสเซอร์ซึ่ง เป็นพื้นฐานของกลไก การเรียกใช้ระบบ ทั้งหมด ในทางตรงกันข้ามกับภาษาแอสเซมบลีภาษาโปรแกรมระดับสูง ส่วนใหญ่ สามารถพกพาได้ข้ามสถาปัตยกรรมหลายแบบ แต่ต้องใช้การตีความหรือการคอมไพล์ ซึ่งเป็นงานที่ซับซ้อนกว่าการประกอบมาก
ในช่วงทศวรรษแรกของการคำนวณ การเขียนโปรแกรมระบบและการเขียนโปรแกรมแอปพลิเคชันมักจะใช้ภาษาแอสเซมบลีทั้งหมด แม้ว่าภาษาแอสเซมบลีจะยังคงเป็นสิ่งที่ขาดไม่ได้สำหรับบางวัตถุประสงค์ แต่ปัจจุบันการเขียนโปรแกรมส่วนใหญ่ดำเนินการในภาษาระดับสูงทั้งแบบตีความและแบบคอมไพล์ ในบทความ " No Silver Bullet " เฟรด บรูคส์สรุปผลกระทบของการเปลี่ยนจากการเขียนโปรแกรมด้วยภาษาแอสเซมบลีว่า "แน่นอนว่าสิ่งที่ทรงพลังที่สุดสำหรับประสิทธิภาพ ความน่าเชื่อถือ และความเรียบง่ายของซอฟต์แวร์คือการใช้ภาษาระดับสูงในการเขียนโปรแกรมอย่างต่อเนื่อง ผู้สังเกตการณ์ส่วนใหญ่เชื่อว่าการพัฒนานี้ทำให้ประสิทธิภาพเพิ่มขึ้นอย่างน้อยห้าเท่า และยังส่งผลให้ความน่าเชื่อถือ ความเรียบง่าย และความเข้าใจง่ายขึ้นด้วย" [ 14 ]
ปัจจุบัน การใช้โค้ดภาษาแอสเซมบลีจำนวนเล็กน้อยภายในระบบขนาดใหญ่ที่เขียนด้วยภาษาโปรแกรมระดับสูงเป็นเรื่องปกติ ด้วยเหตุผลด้านประสิทธิภาพหรือเพื่อโต้ตอบกับฮาร์ดแวร์โดยตรงในลักษณะที่ภาษาโปรแกรมระดับสูงไม่รองรับ ตัวอย่างเช่น โค้ดต้นฉบับของเคอร์เนลลินุก ซ์เวอร์ชัน 4.9 เขียนด้วยภาษาแอสเซมบลีเพียงไม่ถึง 2% ในขณะที่มากกว่า 97% เขียนด้วยภาษาC [ 15 ]
ไวยากรณ์ภาษาแอสเซมบลี
ภาษาแอสเซมบลีใช้ สัญลักษณ์ ช่วยจำ เพื่อแสดง คำสั่งเครื่องระดับต่ำ( opcodes ) คำสั่งและโดยทั่วไปแล้ว รีจิสเตอร์ และแฟล็กทางสถาปัตยกรรม[ 16 ]สัญลักษณ์ช่วยจำบางส่วนอาจเป็นแบบในตัวและบางส่วนอาจกำหนดโดยผู้ใช้ การดำเนินการหลายอย่างต้องการตัวถูกดำเนินการ อย่างน้อยหนึ่งตัว เพื่อสร้างคำสั่งที่สมบูรณ์ แอสเซมเบลอร์ส่วนใหญ่จะอนุญาตให้ใช้ค่าคงที่ รีจิสเตอร์ และป้ายกำกับ ที่มีชื่อ สำหรับตำแหน่งโปรแกรมและหน่วยความจำ และสามารถคำนวณนิพจน์สำหรับตัวถูกดำเนินการได้ ดังนั้น โปรแกรมเมอร์จึงไม่ต้องคำนวณซ้ำซากน่าเบื่อ และโปรแกรมแอสเซมเบลอร์จึงอ่านง่ายกว่าโค้ดเครื่องมาก ขึ้นอยู่กับสถาปัตยกรรม องค์ประกอบเหล่านี้อาจรวมกันสำหรับคำสั่งเฉพาะหรือโหมดการกำหนดแอดเดรสโดยใช้ค่าชดเชยหรือข้อมูลอื่น ๆ รวมถึงแอดเดรสคงที่ แอสเซมเบลอร์หลายตัวมีกลไกเพิ่มเติมเพื่ออำนวยความสะดวกในการพัฒนาโปรแกรม ควบคุมกระบวนการแอสเซมบลี และช่วยในการดีบัก
บางโปรแกรมแอสเซมเบลอร์เป็นแบบจัดเรียงตามคอลัมน์ โดยมีฟิลด์เฉพาะอยู่ในคอลัมน์ที่กำหนด ซึ่งเป็นเรื่องปกติมากสำหรับเครื่องที่ใช้บัตรเจาะรูในช่วงทศวรรษ 1950 และต้นทศวรรษ 1960 บางโปรแกรมแอสเซมเบลอร์มีไวยากรณ์แบบอิสระ โดยมีฟิลด์คั่นด้วยตัวคั่น เช่น เครื่องหมายวรรคตอน หรือช่องว่างบางโปรแกรมแอสเซมเบลอร์เป็นแบบผสม โดยมีป้ายกำกับอยู่ในคอลัมน์เฉพาะ และฟิลด์อื่นๆ คั่นด้วยตัวคั่น ซึ่งรูปแบบนี้เป็นที่นิยมมากกว่าไวยากรณ์แบบจัดเรียงตามคอลัมน์ในช่วงทศวรรษ 1960
ศัพท์เฉพาะ
- มาโครแอสเซมเบลอร์คือแอสเซมเบลอร์ที่มี ฟังก์ชัน สำหรับคำสั่งมาโครเพื่อให้สามารถแทนข้อความภาษาแอสเซมบลี (ที่มีพารามิเตอร์) ด้วยชื่อ และใช้ชื่อนั้นในการแทรกข้อความที่ขยายแล้วลงในโค้ดอื่นได้
- โค้ดแบบเปิดหมายถึง ข้อมูลป้อนเข้าจากภาษาแอสเซมบลีใดๆ ที่อยู่นอกเหนือคำจำกัดความของมาโคร
- แอสเซมเบลอร์แบบครอส (ดูเพิ่มเติมที่คอมไพเลอร์แบบครอส ) คือแอสเซมเบลอร์ที่ทำงานบนคอมพิวเตอร์หรือระบบปฏิบัติการ ( ระบบ โฮสต์ ) ที่ต่างจากระบบที่ต้องการใช้งานโค้ดที่ได้ ( ระบบเป้าหมาย ) การประกอบแบบครอสช่วยอำนวยความสะดวกในการพัฒนาโปรแกรมสำหรับระบบที่ไม่มีทรัพยากรเพียงพอสำหรับการพัฒนาซอฟต์แวร์ เช่นระบบฝังตัวหรือไมโครคอนโทรลเลอร์ในกรณีเช่นนี้โค้ดออบเจ็กต์ ที่ได้ จะต้องถูกถ่ายโอนไปยังระบบเป้าหมายผ่านหน่วยความจำแบบอ่านอย่างเดียว (ROM, EPROMเป็นต้น) โปรแกรมเมอร์ (เมื่อหน่วยความจำแบบอ่านอย่างเดียวถูกรวมอยู่ในอุปกรณ์ เช่น ในไมโครคอนโทรลเลอร์) หรือลิงก์ข้อมูล โดยใช้สำเนาโค้ดออบเจ็กต์แบบบิตต่อบิตที่เหมือนกันทุกประการ หรือการแสดงโค้ดนั้นในรูปแบบข้อความ (เช่นIntel hexหรือMotorola S-record )
- โปรแกรมแอสเซมเบลอร์ระดับสูงคือโปรแกรมที่ให้แนวคิดเชิงนามธรรมของภาษา ซึ่งมักพบได้ในภาษาโปรแกรมระดับสูง เช่น โครงสร้างควบคุมขั้นสูง ( IF/THEN/ELSE , DO CASE เป็นต้น) และชนิดข้อมูลนามธรรมระดับสูง รวมถึงโครงสร้าง/เรคอร์ด ยูเนียน คลาส และเซต
- ไมโครแอสเซมเบลอร์คือโปรแกรมที่ช่วยเตรียมไมโครโปรแกรมเพื่อควบคุมการทำงานระดับต่ำของคอมพิวเตอร์
- เมตาแอสเซมเบลอร์คือ "โปรแกรมที่ยอมรับคำอธิบายทางไวยากรณ์และความหมายของภาษาแอสเซมบลี และสร้างแอสเซมเบลอร์สำหรับภาษานั้น" [ 17 ]หรือที่ยอมรับไฟล์ต้นฉบับแอสเซมเบลอร์พร้อมกับคำอธิบายดังกล่าว และประกอบไฟล์ต้นฉบับตามคำอธิบายนั้น แอสเซมเบลอร์ "เมตา-สัญลักษณ์" สำหรับ คอมพิวเตอร์ ซีรี่ส์ SDS 9และซีรี่ส์ SDS Sigmaเป็นเมตาแอสเซมเบลอร์[ 18 ] Sperry Univacยังได้จัดเตรียมเมตาแอสเซมเบลอร์สำหรับ ซีรี่ส์ UNIVAC 1100/2200 ด้วย [ 19 ]
- แอสเซมเบลอร์แบบอินไลน์ (หรือแอสเซมเบลอร์แบบฝังตัว ) คือโค้ดแอสเซมเบลอร์ที่อยู่ในโปรแกรมภาษาระดับสูง [ 20 ]ส่วนใหญ่จะใช้ในโปรแกรมระบบที่ต้องการเข้าถึงฮาร์ดแวร์โดยตรง
แนวคิดหลัก
แอสเซมเบลอร์
โปรแกรม แอสเซมเบลอร์สร้างโค้ดวัตถุโดยการแปลชุดค่าผสมของตัวย่อและไวยากรณ์สำหรับการดำเนินการและโหมดการกำหนดแอดเดรสให้เป็นค่าเทียบเท่าเชิงตัวเลข โดยทั่วไปการแสดงผลนี้จะรวมถึงรหัสการดำเนินการ (" opcode ") รวมถึงบิต ควบคุม และข้อมูลอื่นๆ แอสเซมเบลอร์ยังคำนวณนิพจน์ค่าคงที่และแก้ไขชื่อสัญลักษณ์สำหรับตำแหน่งหน่วยความจำและเอนทิตีอื่นๆ[ 21 ]การใช้การอ้างอิงเชิงสัญลักษณ์เป็นคุณลักษณะสำคัญของแอสเซมเบลอร์ ซึ่งช่วยประหยัดการคำนวณที่ยุ่งยากและการอัปเดตแอดเดรสด้วยตนเองหลังจากการแก้ไขโปรแกรม แอสเซมเบลอร์ส่วนใหญ่ยังรวมถึง สิ่งอำนวยความสะดวก มาโครสำหรับการแทนที่ข้อความ เช่น เพื่อสร้างลำดับคำสั่งสั้นๆ ทั่วไปเป็นแบบอินไลน์แทนที่จะเรียกใช้ซับรูทีน
แอสเซมเบลอร์บางตัวอาจสามารถทำการเพิ่มประสิทธิภาพเฉพาะชุดคำสั่ง แบบง่ายๆ ได้ ด้วย ตัวอย่างที่เป็นรูปธรรมอย่างหนึ่งคือ แอสเซมเบลอร์ x86 ที่พบได้ทั่วไป จากผู้ผลิตหลายราย เรียกว่าการ กำหนด ขนาดการกระโดด[ 21 ]ส่วนใหญ่สามารถทำการแทนที่คำสั่งการกระโดด (การกระโดดแบบยาวถูกแทนที่ด้วยการกระโดดแบบสั้นหรือแบบสัมพัทธ์) ในจำนวนรอบใดๆ ก็ได้ตามคำขอ บางตัวอาจทำการจัดเรียงใหม่หรือแทรกคำสั่งอย่างง่ายๆ เช่น แอสเซมเบลอร์บางตัวสำหรับสถาปัตยกรรม RISCที่สามารถช่วยเพิ่มประสิทธิภาพการจัดกำหนดการคำสั่ง ที่เหมาะสม เพื่อใช้ประโยชน์จากไปป์ไลน์ของ CPUอย่างมีประสิทธิภาพที่สุด[ 22 ]
ภาษาแอสเซมบลีมีให้ใช้งานมาตั้งแต่ทศวรรษ 1950 โดยเป็นขั้นแรกที่อยู่เหนือภาษาเครื่องและก่อนที่จะมีภาษาโปรแกรมระดับสูงเช่นFortran , Algol , COBOLและLisp นอกจากนี้ยังมีตัวแปลภาษาและ ตัวสร้างโค้ดกึ่งอัตโนมัติหลายประเภทที่มีคุณสมบัติคล้ายคลึงกับทั้งภาษาแอสเซมบลีและภาษาโปรแกรมระดับสูง โดยSpeedcodeอาจเป็นหนึ่งในตัวอย่างที่รู้จักกันดีที่สุด
อาจมีแอสเซมเบลอร์หลายตัวที่มีไวยากรณ์ แตกต่างกัน สำหรับซีพียูหรือสถาปัตยกรรมชุดคำสั่ง เฉพาะ ตัวอย่างเช่น คำสั่งเพิ่มข้อมูลหน่วยความจำไปยังรีจิสเตอร์ใน โปรเซสเซอร์ตระกูล x86อาจเป็นadd eax,[ebx]ในไวยากรณ์ดั้งเดิมของ Intelในขณะที่คำสั่งนี้จะเขียนaddl (%ebx),%eaxในไวยากรณ์ AT&Tที่ใช้โดยGNU Assemblerแม้จะมีลักษณะที่แตกต่างกัน แต่รูปแบบไวยากรณ์ที่แตกต่างกันโดยทั่วไปจะสร้างรหัสเครื่อง ตัวเลขเดียวกัน แอสเซมเบลอร์ตัวเดียวอาจมีโหมดที่แตกต่างกันเพื่อรองรับความหลากหลายในรูปแบบไวยากรณ์รวมถึงการตีความความหมายที่แน่นอน (เช่น ไวยากรณ์ FASM , ไวยากรณ์ TASM , โหมดในอุดมคติ ฯลฯ ในกรณีพิเศษของ การเขียนโปรแกรม แอสเซมบลี x86 )
จำนวนบัตรผ่าน
มีแอสเซมเบลอร์อยู่สองประเภท โดยพิจารณาจากจำนวนรอบที่ต้องประมวลผลโค้ดต้นฉบับ (จำนวนครั้งที่แอสเซมเบลอร์อ่านโค้ดต้นฉบับ) เพื่อสร้างไฟล์ออบเจ็กต์
- โปรแกรมแอสเซมเบลอร์แบบประมวลผลครั้งเดียวจะประมวลผลซอร์สโค้ดเพียงครั้งเดียว สำหรับสัญลักษณ์ที่ใช้ก่อนที่จะมีการกำหนดความหมาย โปรแกรมแอสเซมเบลอร์จะสร้าง"ข้อผิดพลาด" (errata)หลังจากที่มีการกำหนดความหมายแล้ว เพื่อบอกให้โปรแกรมลิงเกอร์หรือโปรแกรมโหลดแก้ไขตำแหน่งที่ใช้สัญลักษณ์ที่ยังไม่ได้รับการกำหนดความหมายเหล่านั้น
- โปรแกรมแอสเซมเบลอร์แบบหลายรอบจะสร้างตารางที่มีสัญลักษณ์ทั้งหมดและค่าของสัญลักษณ์เหล่านั้นในรอบแรกๆ จากนั้นจะใช้ตารางนั้นในรอบต่อๆ ไปเพื่อสร้างโค้ด
ในทั้งสองกรณี ตัวประกอบภาษาจะต้องสามารถกำหนดขนาดของแต่ละคำสั่งในการประมวลผลรอบแรกๆ เพื่อคำนวณที่อยู่ของสัญลักษณ์ถัดไป ซึ่งหมายความว่า หากขนาดของการดำเนินการที่อ้างอิงถึงตัวถูกดำเนินการที่กำหนดไว้ในภายหลังขึ้นอยู่กับชนิดหรือระยะห่างของตัวถูกดำเนินการ ตัวประกอบภาษาจะทำการประมาณค่าแบบมองโลกในแง่ร้ายเมื่อพบการดำเนินการนั้นเป็นครั้งแรก และหากจำเป็น จะเพิ่มคำสั่ง " ไม่มีการดำเนินการ " หนึ่งคำสั่งหรือมากกว่านั้นในการประมวลผลรอบถัดไปหรือในส่วนแก้ไขข้อผิดพลาด ในตัวประกอบภาษาที่มีการเพิ่มประสิทธิภาพแบบ peepholeที่อยู่สามารถคำนวณใหม่ได้ระหว่างการประมวลผลเพื่อให้สามารถแทนที่โค้ดที่มองโลกในแง่ร้ายด้วยโค้ดที่ปรับให้เหมาะสมกับระยะห่างที่แน่นอนจากเป้าหมาย
เหตุผลดั้งเดิมของการใช้แอสเซมเบลอร์แบบผ่านครั้งเดียวคือขนาดหน่วยความจำและความเร็วในการประกอบ – บ่อยครั้งที่การประมวลผลครั้งที่สองจะต้องจัดเก็บตารางสัญลักษณ์ไว้ในหน่วยความจำ (เพื่อจัดการกับการอ้างอิงไปข้างหน้า ) การกรอและอ่านซอร์สโค้ดโปรแกรมบนเทป อีกครั้ง หรือการอ่านสำรับไพ่หรือเทปกระดาษเจาะรูอีกครั้งคอมพิวเตอร์รุ่นหลังที่มีหน่วยความจำขนาดใหญ่กว่ามาก (โดยเฉพาะการจัดเก็บข้อมูลบนดิสก์) มีพื้นที่เพียงพอที่จะดำเนินการประมวลผลที่จำเป็นทั้งหมดโดยไม่ต้องอ่านซ้ำ ข้อดีของแอสเซมเบลอร์แบบหลายรอบคือการไม่มีข้อผิดพลาดทำให้กระบวนการเชื่อมโยง (หรือการโหลดโปรแกรมหากแอสเซมเบลอร์สร้างโค้ดที่สามารถเรียกใช้งานได้โดยตรง) เร็วขึ้น[ 23 ]
ตัวอย่าง:ในโค้ดตัวอย่างต่อไปนี้ แอสเซมเบลอร์แบบผ่านครั้งเดียวจะสามารถระบุที่อยู่ของการอ้างอิงย้อนกลับBKWD ได้ เมื่อประกอบคำสั่งS2แต่จะไม่สามารถระบุที่อยู่ของการอ้างอิงไปข้างหน้าFWD ได้ เมื่อประกอบคำสั่งกระโดดS1อันที่จริงFWDอาจเป็นค่าที่ไม่ถูกกำหนดไว้ แอสเซมเบลอร์แบบผ่านสองครั้งจะระบุที่อยู่ทั้งสองได้ในรอบที่ 1 ดังนั้นจึงทราบที่อยู่เหล่านั้นเมื่อสร้างโค้ดในรอบที่ 2
S1 B เดินหน้า ... FWD EQU * ... BKWD EQU * ... S2 B BKWD
ผู้ประกอบระดับสูง
โปรแกรมแอสเซมเบลอร์ระดับสูงที่มีความซับซ้อนกว่าจะให้แนวคิดเชิงนามธรรมของภาษา เช่น:
- การประกาศและการเรียกใช้ขั้นตอน/ฟังก์ชันระดับสูง
- โครงสร้างควบคุมขั้นสูง (IF/THEN/ELSE, SWITCH)
- ประเภทข้อมูลนามธรรมระดับสูง ได้แก่ โครงสร้าง/ระเบียน ยูเนียน คลาส และเซต
- การประมวลผลมาโครที่ซับซ้อน (แม้ว่าจะมีอยู่ในภาษาแอสเซมเบลอร์ทั่วไปตั้งแต่ปลายทศวรรษ 1950 เช่น สำหรับซีรี่ส์ IBM 700และซีรี่ส์ IBM 7000และตั้งแต่ทศวรรษ 1960 สำหรับIBM System/360 (S/360) และเครื่องอื่นๆ)
- คุณลักษณะการเขียน โปรแกรมเชิงวัตถุเช่นคลาสวัตถุนามธรรมพหุรูปและการสืบทอด[ 24 ]
ดูรายละเอียดเพิ่มเติมเกี่ยวกับการออกแบบภาษา ได้ด้านล่าง
ภาษาแอสเซมบลี
โปรแกรมที่เขียนด้วยภาษาแอสเซมบลีประกอบด้วยชุด คำสั่งประมวล ผลแบบย่อและเมตาสเตทเมนต์ (ซึ่งรู้จักกันในชื่อต่างๆ เช่น การดำเนินการเชิงประกาศ คำสั่ง คำสั่งเทียม การดำเนินการเทียม และการดำเนินการเทียม) ความคิดเห็น และข้อมูล คำสั่งภาษาแอสเซมบลีมักประกอบด้วย รหัสการทำงาน แบบย่อตามด้วยตัวถูกดำเนินการซึ่งอาจเป็นรายการข้อมูล อาร์กิวเมนต์ หรือพารามิเตอร์[ 25 ] คำสั่งบางคำสั่งอาจเป็น "โดยนัย" ซึ่งหมายความว่าข้อมูลที่คำสั่งดำเนินการนั้นถูกกำหนดโดยนัยโดยตัวคำสั่งเอง คำสั่งดังกล่าวจะไม่รับตัวถูกดำเนินการ คำสั่งที่ได้จะถูกแปลโดยแอสเซมเบลอร์เป็น คำสั่ง ภาษาเครื่องที่สามารถโหลดลงในหน่วยความจำและดำเนินการได้
ตัวอย่างเช่น คำสั่งด้านล่างนี้บอกให้ โปรเซสเซอร์ x86 / IA-32ย้ายค่าทันที 8 บิตไปยังรีจิสเตอร์รหัสไบนารีสำหรับคำสั่งนี้คือ 10110 ตามด้วยตัวระบุ 3 บิตสำหรับรีจิสเตอร์ที่จะใช้ ตัวระบุสำหรับ รีจิสเตอร์ ALคือ 000 ดังนั้นรหัสเครื่อง ต่อไปนี้ จะโหลด รีจิสเตอร์ ALด้วยข้อมูล 01100001 [ 25 ]
10110000 01100001
รหัสคอมพิวเตอร์ไบนารีนี้สามารถทำให้เข้าใจง่ายขึ้นสำหรับมนุษย์ได้โดยการแสดงในรูปแบบเลขฐานสิบหกดังต่อไปนี้
B0 61
ในที่นี้B0หมายถึง "ย้ายสำเนาของค่าต่อไปนี้เข้าไปในAL " และ61เป็นการแสดงค่าเลขฐานสิบหกของค่า 01100001 ซึ่งเท่ากับ 97 ในเลขฐานสิบ ภาษาแอสเซมบลีสำหรับตระกูล 8086 มีตัวย่อMOV (ตัวย่อของmove ) สำหรับคำสั่งเช่นนี้ ดังนั้นรหัสเครื่องข้างต้นจึงสามารถเขียนได้ดังนี้ในภาษาแอสเซมบลี พร้อมด้วยคำอธิบายเพิ่มเติมหากจำเป็น หลังเครื่องหมายเซมิโคลอน วิธีนี้อ่านและจำง่ายกว่ามาก
MOV AL , 61h ; โหลดค่า 97 ในระบบเลขฐานสิบ (61 ในระบบเลขฐานสิบหก) ลงใน ALในภาษาแอสเซมบลีบางภาษา (รวมถึงภาษานี้) ตัวย่อเดียวกัน เช่น MOV อาจใช้สำหรับกลุ่มคำสั่งที่เกี่ยวข้องกับการโหลด คัดลอก และย้ายข้อมูล ไม่ว่าจะเป็นค่าคงที่ ค่าในรีจิสเตอร์ หรือตำแหน่งหน่วยความจำที่ชี้โดยค่าในรีจิสเตอร์หรือโดยที่อยู่โดยตรงที่ฝังอยู่ในคำสั่ง แอสเซมเบลอร์อื่นๆ อาจใช้ตัวย่อรหัสปฏิบัติการที่แตกต่างกัน เช่น L สำหรับ "ย้ายหน่วยความจำไปยังรีจิสเตอร์" ST สำหรับ "ย้ายรีจิสเตอร์ไปยังหน่วยความจำ" LR สำหรับ "ย้ายรีจิสเตอร์ไปยังรีจิสเตอร์" MVI สำหรับ "ย้ายตัวถูกดำเนินการค่าคงที่ไปยังหน่วยความจำ" เป็นต้น
หากใช้ตัวย่อเดียวกันสำหรับคำสั่งที่แตกต่างกัน นั่นหมายความว่าตัวย่อดังกล่าวสอดคล้องกับรหัสคำสั่งไบนารีที่แตกต่างกันหลายรหัส โดยไม่รวมข้อมูล (เช่น61hในตัวอย่างนี้) ขึ้นอยู่กับตัวถูกดำเนินการที่ตามหลังตัวย่อ ตัวอย่างเช่น สำหรับซีพียู x86/IA-32 ไวยากรณ์ภาษาแอสเซมบลีของ Intel MOV AL, AHแสดงถึงคำสั่งที่ย้ายเนื้อหาของรีจิสเตอร์AHไปยังรีจิสเตอร์ALรูปแบบเลขฐานสิบหกของคำสั่งนี้คือ: [ nb 3 ]
88 อี0
ไบต์แรก 88h ระบุการย้ายข้อมูลระหว่างรีจิสเตอร์ขนาดไบต์กับรีจิสเตอร์หรือหน่วยความจำอื่น และไบต์ที่สอง E0h ถูกเข้ารหัส (ด้วยฟิลด์บิตสามฟิลด์) เพื่อระบุว่าตัวถูกดำเนินการทั้งสองเป็นรีจิสเตอร์ ต้นทางคือAHและปลายทางคือAL
ในกรณีเช่นนี้ ที่ตัวย่อเดียวกันสามารถแทนคำสั่งไบนารีได้มากกว่าหนึ่งคำสั่ง ตัวประกอบภาษาแอสเซมเบลอร์จะพิจารณาว่าควรสร้างคำสั่งใดโดยการตรวจสอบตัวถูกดำเนินการ ในตัวอย่างแรก ตัวถูกดำเนินการ61hเป็นค่าคงที่ตัวเลขฐานสิบหกที่ถูกต้องและไม่ใช่ชื่อรีจิสเตอร์ที่ถูกต้อง ดังนั้นจึงB0ใช้ได้เฉพาะคำสั่งนั้นเท่านั้น ในตัวอย่างที่สอง ตัวถูกดำเนินการAHเป็นชื่อรีจิสเตอร์ที่ถูกต้องและไม่ใช่ค่าคงที่ตัวเลขที่ถูกต้อง (ฐานสิบหก ฐานสิบ ฐานแปด หรือฐานสอง) ดังนั้นจึง88ใช้ได้ เฉพาะคำสั่งนั้นเท่านั้น
ภาษาแอสเซมบลีได้รับการออกแบบมาเสมอเพื่อให้มีการบังคับใช้ความไม่กำกวมในลักษณะนี้โดยไวยากรณ์ของมัน ตัวอย่างเช่น ในภาษาแอสเซมบลี Intel x86 ค่าคงที่เลขฐานสิบหกจะต้องขึ้นต้นด้วยตัวเลข ดังนั้นเลขฐานสิบหก 'A' (เท่ากับสิบในระบบเลขฐานสิบ) จะต้องเขียนเป็น0Ahหรือ0AHไม่ใช่AHโดยเฉพาะเพื่อให้ไม่สามารถเข้าใจผิดว่าเป็นชื่อของรีจิสเตอร์AHได้ (กฎเดียวกันนี้ยังป้องกันความกำกวมกับชื่อของรีจิสเตอร์BH , CHและDHรวมถึงสัญลักษณ์ที่ผู้ใช้กำหนดเองใดๆ ที่ลงท้ายด้วยตัวอักษรHและประกอบด้วยเฉพาะตัวเลขฐานสิบหกเท่านั้น เช่น คำว่า "BEACH")
กลับไปที่ตัวอย่างเดิม ในขณะที่โอเปรนด์ x86 10110000 ( B0) คัดลอกค่า 8 บิตลงใน รีจิสเตอร์ ALโอเปรนด์ 10110001 ( B1) ย้ายค่าดังกล่าวไปยังCLและโอเปรนด์ 10110010 ( B2) ย้ายค่าดังกล่าวไปยังDLตัวอย่างภาษาแอสเซมบลีสำหรับสิ่งเหล่านี้มีดังต่อไปนี้[ 25 ]
MOV AL , 1h ; โหลดค่าทันที 1 ลงใน AL MOV CL , 2h ; โหลดค่าทันที 2 ลงใน CL MOV DL , 3h ; โหลดค่าทันที 3 ลงใน DLไวยากรณ์ของ MOV อาจซับซ้อนกว่านี้ได้ดังตัวอย่างต่อไปนี้[ 26 ]
MOV EAX , [ EBX ] ; ย้ายข้อมูล 4 ไบต์ในหน่วยความจำที่แอดเดรสที่อยู่ใน EBX ไปยัง EAX MOV [ ESI + EAX ], CL ; ย้ายเนื้อหาของ CL ไปยังไบต์ที่แอดเดรส ESI+EAX MOV DS , DX ; ย้ายเนื้อหาของ DX ไปยังรีจิสเตอร์เซ็กเมนต์ DSในแต่ละกรณี คำสั่ง MOV จะถูกแปลโดยตรงเป็นรหัสปฏิบัติการ 88-8C, 8E, A0-A3, B0-BF, C6 หรือ C7 โดยแอสเซมเบลอร์ และโดยปกติโปรแกรมเมอร์ไม่จำเป็นต้องรู้หรือจำรหัสปฏิบัติการใด[ 25 ]
โปรแกรมแอสเซมเบลอร์จะแปลงภาษาแอสเซมบลีเป็นรหัสเครื่อง และ โปรแกรม ดีแอสเซมเบลอร์ สามารถแปลงกลับได้บางส่วน ต่างจากภาษาโปรแกรมระดับสูง แอ สเซมเบลอร์ มีความสัมพันธ์แบบหนึ่งต่อหนึ่งระหว่างคำสั่งแอสเซมบลีอย่างง่ายหลายๆ คำสั่งกับคำสั่งภาษาเครื่อง อย่างไรก็ตาม ในบางกรณี แอสเซมเบลอร์อาจมี คำสั่ง เสมือน (โดยพื้นฐานแล้วคือมาโคร) ซึ่งขยายเป็นคำสั่งภาษาเครื่องหลายคำสั่งเพื่อให้ฟังก์ชันการทำงานที่จำเป็นทั่วไป ตัวอย่างเช่น สำหรับเครื่องที่ไม่มีคำสั่ง "กระโดดถ้ามากกว่าหรือเท่ากับ" แอสเซมเบลอร์อาจมีคำสั่งเสมือนที่ขยายเป็นคำสั่ง "ตั้งค่าถ้าน้อยกว่า" และ "กระโดดถ้าเป็นศูนย์ (จากผลลัพธ์ของคำสั่งตั้งค่า)" ของเครื่องนั้น แอสเซมเบลอร์ที่มีคุณสมบัติครบถ้วนส่วนใหญ่ยังให้ ภาษา มาโคร ที่หลากหลาย (กล่าวถึงด้านล่าง) ซึ่งผู้ผลิตและโปรแกรมเมอร์ใช้ในการสร้างรหัสและลำดับข้อมูลที่ซับซ้อนยิ่งขึ้น เนื่องจากข้อมูลเกี่ยวกับคำสั่งเสมือนและมาโครที่กำหนดไว้ในสภาพแวดล้อมของแอสเซมเบลอร์นั้นไม่มีอยู่ในโปรแกรมออบเจ็กต์ ดังนั้นดิสแอสเซมเบลอร์จึงไม่สามารถสร้างการเรียกใช้มาโครและคำสั่งเสมือนขึ้นมาใหม่ได้ แต่สามารถดิสแอสเซมเบลอร์ได้เฉพาะคำสั่งเครื่องจริงที่แอสเซมเบลอร์สร้างขึ้นจากหน่วยภาษาแอสเซมบลีที่เป็นนามธรรมเหล่านั้นเท่านั้น ในทำนองเดียวกัน เนื่องจากแอสเซมเบลอร์จะไม่สนใจความคิดเห็นในไฟล์ต้นฉบับภาษาแอสเซมบลี และไม่มีผลต่อโค้ดออบเจ็กต์ที่มันสร้างขึ้น ดังนั้นดิสแอสเซมเบลอร์จึงไม่สามารถกู้คืนความคิดเห็นในไฟล์ต้นฉบับได้เลย
สถาปัตยกรรมคอมพิวเตอร์แต่ละแบบมีภาษาเครื่องเป็นของตนเอง คอมพิวเตอร์แตกต่างกันในจำนวนและประเภทของการดำเนินการที่รองรับ ในขนาดและจำนวนของรีจิสเตอร์ที่แตกต่างกัน และในการแสดงข้อมูลในหน่วยจัดเก็บ แม้ว่าคอมพิวเตอร์ใช้งานทั่วไปส่วนใหญ่จะสามารถทำงานได้เหมือนกันโดยพื้นฐาน แต่ก็มีวิธีการที่แตกต่างกัน ภาษาแอสเซมบลีที่เกี่ยวข้องจึงสะท้อนให้เห็นถึงความแตกต่างเหล่านี้
อาจมี ชุดตัวช่วยจำหรือไวยากรณ์ภาษาแอสเซมบลีหลายชุดสำหรับชุดคำสั่งเดียว ซึ่งโดยทั่วไปจะถูกนำไปใช้ในโปรแกรมแอสเซมบลีที่แตกต่างกัน ในกรณีเหล่านี้ ชุดที่นิยมใช้มากที่สุดมักจะเป็นชุดที่ผู้ผลิตซีพียูจัดหาให้และใช้ในเอกสารประกอบของตน
ตัวอย่างของซีพียูที่มีชุดตัวย่อ (mnemonics) สองชุดที่แตกต่างกัน ได้แก่ ตระกูล Intel 8080 และ Intel 8086/8088 เนื่องจาก Intel อ้างสิทธิ์ในลิขสิทธิ์ของตัวย่อภาษาแอสเซมบลี (อย่างน้อยก็ในทุกหน้าของเอกสารที่เผยแพร่ในช่วงทศวรรษ 1970 และต้นทศวรรษ 1980) บริษัทบางแห่งที่ผลิตซีพียูที่เข้ากันได้กับชุดคำสั่งของ Intel อย่างอิสระ จึงได้คิดค้นตัวย่อของตนเองขึ้นมา ซีพียู Zilog Z80ซึ่งเป็นการปรับปรุงจากIntel 8080Aรองรับคำสั่งทั้งหมดของ 8080A รวมถึงคำสั่งอื่นๆ อีกมากมาย Zilog ได้คิดค้นภาษาแอสเซมบลีใหม่ทั้งหมด ไม่เพียงแต่สำหรับคำสั่งใหม่ เท่านั้น แต่ยังรวมถึงคำสั่งทั้งหมดของ 8080A ด้วย ตัวอย่างเช่น ในขณะที่ Intel ใช้ตัวย่อMOV , MVI , LDA , STA , LXI , LDAX , STAX , LHLDและSHLDสำหรับคำสั่งการถ่ายโอนข้อมูลต่างๆ ภาษาแอสเซมบลีของ Z80 ใช้ตัวย่อLDสำหรับคำสั่งเหล่านั้นทั้งหมด กรณีที่คล้ายกันคือ ซีพียู NEC V20และV30ซึ่งเป็นสำเนาที่ได้รับการปรับปรุงของ Intel 8086 และ 8088 ตามลำดับ เช่นเดียวกับ Zilog กับ Z80 ทาง NEC ได้คิดค้นตัวย่อใหม่สำหรับคำสั่งทั้งหมดของ 8086 และ 8088 เพื่อหลีกเลี่ยงข้อกล่าวหาเรื่องการละเมิดลิขสิทธิ์ของ Intel (เป็นที่น่าสงสัยว่าลิขสิทธิ์ดังกล่าวจะถูกต้องตามกฎหมายหรือไม่ และต่อมาบริษัทซีพียูเช่นAMD [ nb 4 ]และCyrixได้เผยแพร่ตัวย่อคำสั่ง x86/IA-32 ของ Intel อีกครั้งโดยไม่ได้รับอนุญาตหรือถูกลงโทษทางกฎหมาย) เป็นที่น่าสงสัยว่าในทางปฏิบัติแล้วมีคนจำนวนมากที่เขียนโปรแกรม V20 และ V30 เขียนด้วยภาษาแอสเซมบลีของ NEC มากกว่าของ Intel หรือไม่ เนื่องจากภาษาแอสเซมบลีสองภาษาใดๆ สำหรับสถาปัตยกรรมชุดคำสั่งเดียวกันนั้นเป็นไอโซมอร์ฟิก (คล้ายกับภาษาอังกฤษและPig Latin ) จึงไม่มีข้อกำหนดให้ใช้ภาษาแอสเซมบลีที่ผู้ผลิตเผยแพร่เองกับผลิตภัณฑ์ของผู้ผลิตนั้น
ตัวอย่าง
"สวัสดีโลก!" บนฮาร์ดแวร์ x86 32 บิตแบบพื้นฐาน
สามารถพิมพ์ข้อความ "Hello, world!" ได้โดยใช้ภาษาแอสเซมบลี 32 บิตสำหรับ โปรเซสเซอร์ x86โดยอาศัยความช่วยเหลือจากระบบปฏิบัติการเพียงเล็กน้อย คำสั่ง "call outchr" จะเรียกกลไกบางอย่างที่พิมพ์อักขระในภาษาแอสเซมบลีไปยังคอนโซล สตริงที่มีความยาวไม่เป็นศูนย์จะต้องลงท้ายด้วยไบต์ศูนย์
hello: mov esi , msg ; ย้ายที่อยู่ของสตริงไปยัง ESI cld ; ตั้งทิศทางเพื่อเพิ่มค่า ESI lodsb ; โหลดอักขระตัวแรกใน AL เพิ่มค่า ESI chrlp: call outchr ; พิมพ์อักขระใน AL lodsb ; โหลดอักขระตัวถัดไปใน AL เพิ่มค่า ESI หรือal , al ; เป็นอักขระสิ้นสุดศูนย์หรือไม่? bne chrlp ; ถ้าไม่ใช่ ให้ดำเนินการต่อret ; กลับไปยังผู้เรียกmsg: db 'Hello, world!' , 0xa , 0x0 ; สตริงที่จะพิมพ์"สวัสดีโลก!" บนระบบ Linux x86 32 บิต
ในภาษาแอสเซมบลี 32 บิตสำหรับลินุกซ์บน โปรเซสเซอร์ x86ข้อความ "Hello, world!" จะถูกพิมพ์ออกมาด้วยการเรียกใช้ระบบปฏิบัติการเพียงครั้งเดียว:
ส่วน.text ; จุดเริ่มต้นของส่วนโค้ดglobal _start ; ประกาศตัวแปร _start ให้สามารถมองเห็นได้ในไฟล์อ็อบเจ็กต์ที่สร้างขึ้น_start: mov edx , len ; ความยาวของสตริง อาร์กิวเมนต์ที่สามของ write() mov ecx , msg ; ที่อยู่ของสตริง อาร์กิวเมนต์ที่สองของ write() mov ebx , 1 ; ตัวระบุไฟล์ (เอาต์พุตมาตรฐาน) อาร์กิวเมนต์แรกของ write() mov eax , 4 ; หมายเลขการเรียกใช้ระบบสำหรับ write() int 0x80 ; กับดักการเรียกใช้ระบบmov ebx , 0 ; รหัสออก อาร์กิวเมนต์แรกของ exit() mov eax , 1 ; หมายเลขการเรียกใช้ระบบสำหรับ exit() int 0x80 ; กับดักการเรียกใช้ระบบส่วน.data ; จุดเริ่มต้นของส่วนข้อมูลmsg db 'Hello, world!' , 0xa ; ข้อความที่จะพิมพ์len equ $ - msg ; ความยาวของข้อความนั้นเป็นค่าคงที่ที่คำนวณในระหว่างการประกอบการออกแบบภาษา
องค์ประกอบพื้นฐาน
มีความหลากหลายอย่างมากในวิธีการที่ผู้เขียนโปรแกรมแอสเซมเบลอร์จัดประเภทคำสั่งและใช้คำศัพท์เฉพาะ โดยเฉพาะอย่างยิ่ง บางคนเรียกสิ่งอื่นใดที่ไม่ใช่ตัวย่อของเครื่องหรือตัวย่อแบบขยายว่าเป็นคำสั่งเสมือน (pseudo-operation หรือ pseudo-op) ภาษาแอสเซมบลีทั่วไปประกอบด้วยคำสั่ง 3 ประเภทที่ใช้กำหนดการทำงานของโปรแกรม:
- ตัวช่วยจำรหัสปฏิบัติการ
- คำจำกัดความของข้อมูล
- คำสั่งของสภา
ตัวช่วยจำรหัสคำสั่งและตัวช่วยจำแบบขยาย
คำสั่ง (ข้อความ) ในภาษาแอสเซมบลีโดยทั่วไปนั้นง่ายมาก ต่างจากคำสั่งในภาษาโปรแกรมระดับสูงโดยทั่วไปแล้ว ตัวย่อ (mnemonic) คือชื่อเชิงสัญลักษณ์สำหรับคำสั่งภาษาเครื่องที่สามารถประมวลผลได้เพียงคำสั่งเดียว ( opcode ) และจะมีตัวย่อ opcode อย่างน้อยหนึ่งตัวที่กำหนดไว้สำหรับแต่ละคำสั่งภาษาเครื่อง คำสั่งแต่ละคำสั่งโดยทั่วไปประกอบด้วยการดำเนินการหรือopcodeบวกกับตัวถูกดำเนินการ (operand) ตั้งแต่ศูนย์ตัว ขึ้นไป คำสั่งส่วนใหญ่จะอ้างอิงถึงค่าเดียวหรือคู่ของค่า ตัวถูกดำเนินการอาจเป็นค่าคงที่ (ค่าที่เข้ารหัสในคำสั่งเอง) รีจิสเตอร์ที่ระบุในคำสั่งหรือโดยนัย หรือที่อยู่ของข้อมูลที่อยู่ในหน่วยเก็บข้อมูลอื่น ๆ สิ่งเหล่านี้ถูกกำหนดโดยสถาปัตยกรรมของโปรเซสเซอร์พื้นฐาน: ตัวประกอบภาษาแอสเซมบลีเป็นเพียงการสะท้อนวิธีการทำงานของสถาปัตยกรรมนี้ตัวย่อแบบขยายมักใช้เพื่อระบุการรวมกันของ opcode กับตัวถูกดำเนินการเฉพาะ เช่น ตัวประกอบภาษาแอสเซมบลี System/360 ใช้Bเป็นตัวย่อแบบขยายสำหรับBCโดยมีมาสก์เป็น 15 และNOP("NO OPeration" – ไม่ทำอะไรเลยในหนึ่งขั้นตอน) สำหรับBCโดยมีมาสก์เป็น 0
มักใช้ ตัวย่อเพิ่มเติมเพื่อรองรับการใช้งานคำสั่งเฉพาะทาง ซึ่งมักมีจุดประสงค์ที่ไม่ชัดเจนจากชื่อคำสั่ง ตัวอย่างเช่น CPU หลายตัวไม่มีคำสั่ง NOP ที่ชัดเจน แต่มีคำสั่งที่สามารถใช้เพื่อจุดประสงค์ดังกล่าวได้ ใน CPU 8086 คำสั่งนี้ใช้สำหรับโดยที่เป็นรหัสเทียมเพื่อเข้ารหัสคำสั่ง ตัวถอดรหัสบางตัวรู้จักสิ่งนี้และจะถอดรหัสคำสั่งเป็น ในทำนองเดียวกัน ตัวประกอบของ IBM สำหรับSystem/360และSystem/370ใช้ตัวย่อเพิ่มเติมและสำหรับและด้วยมาสก์ศูนย์ สำหรับสถาปัตยกรรม SPARC สิ่งเหล่านี้เรียกว่า คำ สั่งสังเคราะห์[ 27 ]xchgax,axnopnopxchgax,axxchgax,axnopNOPNOPRBCBCR
แอสเซมเบลอร์บางตัวยังรองรับคำสั่งมาโครในตัวแบบง่ายๆ ที่สร้างคำสั่งเครื่องสองคำสั่งขึ้นไป ตัวอย่างเช่น แอสเซมเบลอร์ Z80 บางตัวld hl,bcจะรู้จักคำสั่งนี้เพื่อสร้างคำสั่งld l,cตามด้วยld h,b[ 28 ]บางครั้งคำสั่งเหล่านี้เรียกว่ารหัสเทียม
สัญลักษณ์ช่วยจำคือสัญลักษณ์ที่กำหนดขึ้นเอง ในปี พ.ศ. 2528 IEEEได้เผยแพร่มาตรฐาน 694 สำหรับชุดสัญลักษณ์ช่วยจำที่เป็นเอกภาพซึ่งใช้โดยแอสเซมเบลอร์ทั้งหมด[ 29 ]มาตรฐานดังกล่าวถูกยกเลิกไปแล้ว
คำสั่งข้อมูล
มีคำสั่งที่ใช้ในการกำหนดองค์ประกอบข้อมูลเพื่อเก็บข้อมูลและตัวแปร คำสั่งเหล่านี้กำหนดชนิดของข้อมูล ความยาว และการจัดเรียงข้อมูล นอกจากนี้ คำสั่งเหล่านี้ยังสามารถกำหนดได้ว่าข้อมูลนั้นสามารถใช้งานได้โดยโปรแกรมภายนอก (โปรแกรมที่ประกอบแยกต่างหาก) หรือเฉพาะโปรแกรมที่กำหนดส่วนข้อมูลนั้นไว้เท่านั้น โปรแกรมแอสเซมเบลอร์บางตัวจัดประเภทคำสั่งเหล่านี้เป็นคำสั่งเสมือน (pseudo-ops)
คำสั่งของสภา
คำสั่งประกอบ หรือที่เรียกว่า pseudo-opcodes, pseudo-operations หรือ pseudo-ops คือคำสั่งที่ให้กับแอสเซมเบลอร์ "เพื่อสั่งให้มันดำเนินการอื่นนอกเหนือจากการประกอบคำสั่ง" [ 21 ]คำสั่งเหล่านี้มีผลต่อวิธีการทำงานของแอสเซมเบลอร์ และ "อาจมีผลต่อ object code, ตารางสัญลักษณ์, ไฟล์รายการ และค่าของพารามิเตอร์ภายในของแอสเซมเบลอร์" บางครั้งคำว่าpseudo-opcodeจะสงวนไว้สำหรับคำสั่งที่สร้าง object code เช่น คำสั่งที่สร้างข้อมูล[ 30 ]
ชื่อของคำสั่งเสมือน (pseudo-ops) มักเริ่มต้นด้วยจุดเพื่อแยกแยะออกจากคำสั่งเครื่อง คำสั่งเสมือนสามารถทำให้การประกอบโปรแกรมขึ้นอยู่กับพารามิเตอร์ที่ป้อนโดยโปรแกรมเมอร์ ทำให้โปรแกรมหนึ่งสามารถประกอบได้หลายวิธี อาจเพื่อการใช้งานที่แตกต่างกัน หรือคำสั่งเสมือนสามารถใช้เพื่อจัดการการนำเสนอของโปรแกรมเพื่อให้ง่ายต่อการอ่านและบำรุงรักษา การใช้งานคำสั่งเสมือนที่พบบ่อยอีกอย่างหนึ่งคือการสงวนพื้นที่จัดเก็บสำหรับข้อมูลขณะทำงาน และอาจกำหนดค่าเริ่มต้นให้กับเนื้อหาด้วยค่าที่ทราบแล้ว
ภาษาแอสเซมเบลอร์เชิงสัญลักษณ์ช่วยให้นักเขียนโปรแกรมสามารถกำหนดชื่อ ( ป้ายกำกับหรือสัญลักษณ์ ) ใดๆ ก็ได้ให้กับตำแหน่งในหน่วยความจำและค่าคงที่ต่างๆ โดยปกติแล้ว ค่าคงที่และตัวแปรทุกตัวจะได้รับชื่อเพื่อให้คำสั่งสามารถอ้างอิงถึงตำแหน่งเหล่านั้นได้โดยใช้ชื่อ ซึ่งส่งเสริมให้โค้ดสามารถอธิบายตัวเองได้ในโค้ดที่ทำงานได้ ชื่อของแต่ละซับรูทีนจะเชื่อมโยงกับจุดเริ่มต้นของมัน ดังนั้นการเรียกใช้ซับรูทีนใดๆ ก็สามารถใช้ชื่อของซับรูทีนนั้นได้ ภายในซับรูทีน ปลายทางของคำสั่ง GOTOจะได้รับป้ายกำกับ แอสเซมเบลอร์บางตัวรองรับสัญลักษณ์เฉพาะที่ซึ่งมักจะแตกต่างกันทางด้านคำศัพท์จากสัญลักษณ์ปกติ (เช่น การใช้ "10$" เป็นปลายทางของคำสั่ง GOTO)
โปรแกรมแอสเซมเบลอร์บางตัว เช่นNASMมีระบบจัดการสัญลักษณ์ที่ยืดหยุ่น ช่วยให้นักโปรแกรมสามารถจัดการเนมสเปซ ต่างๆ คำนวณออฟเซ็ตภายในโครงสร้างข้อมูล โดยอัตโนมัติ และกำหนดป้ายกำกับที่อ้างอิงถึงค่าตัวอักษรหรือผลลัพธ์ของการคำนวณอย่างง่ายที่ดำเนินการโดยแอสเซมเบลอร์ นอกจากนี้ยังสามารถใช้ป้ายกำกับเพื่อกำหนดค่าเริ่มต้นให้กับค่าคงที่และตัวแปรด้วยที่อยู่ที่สามารถย้ายตำแหน่งได้
ภาษาแอสเซมบลี เช่นเดียวกับภาษาคอมพิวเตอร์อื่นๆ ส่วนใหญ่ อนุญาตให้เพิ่มคำอธิบายประกอบลงในซอร์สโค้ดของ โปรแกรม ซึ่งจะถูกละเว้นในระหว่างการประกอบ การใส่คำอธิบายประกอบอย่างรอบคอบเป็นสิ่งสำคัญในโปรแกรมภาษาแอสเซมบลี เนื่องจากความหมายและจุดประสงค์ของลำดับคำสั่งเครื่องไบนารีนั้นอาจยากต่อการระบุ ภาษาแอสเซมบลี "ดิบ" (ที่ไม่มีคำอธิบายประกอบ) ที่สร้างโดยคอมไพเลอร์หรือดิสแอสเซมเบลอร์นั้นค่อนข้างยากต่อการอ่านเมื่อจำเป็นต้องทำการเปลี่ยนแปลง
มาโคร
แอสเซมเบลอร์หลายตัวรองรับมาโครที่กำหนดไว้ล่วงหน้าและบางตัวรองรับ มาโคร ที่โปรแกรมเมอร์กำหนด (และสามารถกำหนดใหม่ได้หลายครั้ง) ซึ่งเกี่ยวข้องกับลำดับของบรรทัดข้อความที่มีตัวแปรและค่าคงที่ฝังอยู่ คำจำกัดความของมาโครส่วนใหญ่[ nb 5 ]จะเป็นการผสมผสานระหว่างคำสั่งแอสเซมเบลอร์ เช่น คำสั่งควบคุม คำสั่งเครื่องเชิงสัญลักษณ์ และแม่แบบสำหรับคำสั่งแอสเซมเบลอร์ ลำดับของบรรทัดข้อความนี้อาจรวมถึงโอเปอเรเตอร์โค้ดหรือคำสั่งควบคุม เมื่อกำหนดมาโครแล้ว สามารถใช้ชื่อของมาโครแทนตัวย่อได้ เมื่อแอสเซมเบลอร์ประมวลผลคำสั่งดังกล่าว มันจะแทนที่คำสั่งด้วยบรรทัดข้อความที่เกี่ยวข้องกับมาโครนั้น จากนั้นประมวลผลราวกับว่ามีอยู่ในไฟล์ซอร์สโค้ด (รวมถึงในแอสเซมเบลอร์บางตัว การขยายมาโครใดๆ ที่มีอยู่ในข้อความที่ใช้แทนที่) มาโครในความหมายนี้มีมาตั้งแต่เครื่องเข้ารหัสอัตโนมัติ ของ IBM ในช่วงทศวรรษ 1950 [ 31 ]
โดยทั่วไปแล้ว โปรแกรมแอสเซมเบลอร์แบบมาโครจะมีคำสั่งต่างๆ เช่น การกำหนดมาโคร การกำหนดตัวแปร การกำหนดค่าตัวแปรให้เป็นผลลัพธ์ของการคำนวณทางคณิตศาสตร์ ตรรกะ หรือนิพจน์สตริง การวนซ้ำ การสร้างโค้ดแบบมีเงื่อนไข คำสั่งบางอย่างอาจถูกจำกัดให้ใช้เฉพาะภายในคำจำกัดความของมาโคร เช่นMEXITในHLASMในขณะที่คำสั่งอื่นๆ อาจได้รับอนุญาตให้ใช้ในโค้ดแบบเปิด (นอกคำจำกัดความของมาโคร) เช่นAIFและCOPYใน HLASM
ในภาษาแอสเซมบลี คำว่า "มาโคร" มีความหมายครอบคลุมมากกว่าในบริบทอื่นๆ เช่นพรีโปรเซสเซอร์ในภาษาโปรแกรมซีซึ่งโดยทั่วไปแล้วคำสั่ง #define จะใช้ในการสร้างมาโครสั้นๆ เพียงบรรทัดเดียว คำสั่งมาโครของแอสเซมเบลอร์ เช่นเดียวกับมาโครในPL/Iและภาษาอื่นๆ บางภาษา อาจเป็น "โปรแกรม" ที่ยาวได้ด้วยตัวเอง ซึ่งจะถูกประมวลผลโดยการตีความของแอสเซมเบลอร์ในระหว่างการประกอบ
เนื่องจากมาโครสามารถมีชื่อที่ 'สั้น' แต่สามารถขยายเป็นโค้ดหลายบรรทัดหรือมากมายได้ จึงสามารถใช้มาโครเพื่อทำให้โปรแกรมภาษาแอสเซมบลีดูสั้นลงมาก โดยใช้จำนวนบรรทัดของซอร์สโค้ดน้อยลง เช่นเดียวกับภาษาโปรแกรมระดับสูง นอกจากนี้ยังสามารถใช้เพื่อเพิ่มโครงสร้างระดับสูงให้กับโปรแกรมแอสเซมบลี และอาจเพิ่มโค้ดดีบักแบบฝังตัวผ่านพารามิเตอร์และคุณสมบัติอื่นๆ ที่คล้ายกันได้อีกด้วย
โปรแกรมแอสเซมเบลอร์สำหรับมาโครมักอนุญาตให้มาโครรับพารามิเตอร์ได้ แอสเซมเบลอร์บางตัวมีภาษามาโครที่ค่อนข้างซับซ้อน โดยรวมเอาองค์ประกอบภาษาขั้นสูง เช่น พารามิเตอร์เสริม ตัวแปรเชิงสัญลักษณ์ เงื่อนไข การจัดการสตริง และการดำเนินการทางคณิตศาสตร์ ซึ่งทั้งหมดนี้สามารถใช้งานได้ในระหว่างการทำงานของมาโคร และอนุญาตให้มาโครบันทึกบริบทหรือแลกเปลี่ยนข้อมูลได้ ดังนั้น มาโครอาจสร้างคำสั่งภาษาแอสเซมบลีหรือคำจำกัดความข้อมูลจำนวนมากโดยอิงจากอาร์กิวเมนต์ของมาโคร สิ่งนี้สามารถใช้เพื่อสร้างโครงสร้างข้อมูลแบบเรคอร์ดหรือลูปแบบ " คลาย " ได้ เช่น หรืออาจสร้างอัลกอริทึมทั้งหมดโดยอิงจากพารามิเตอร์ที่ซับซ้อน ตัวอย่างเช่น มาโคร "เรียงลำดับ" สามารถรับข้อกำหนดของคีย์การเรียงลำดับที่ซับซ้อนและสร้างโค้ดที่สร้างขึ้นสำหรับคีย์เฉพาะนั้น โดยไม่จำเป็นต้องมีการทดสอบขณะทำงานที่จำเป็นสำหรับขั้นตอนทั่วไปที่ตีความข้อกำหนด องค์กรที่ใช้ภาษาแอสเซมบลีซึ่งได้รับการขยายอย่างมากโดยใช้ชุดมาโครดังกล่าว สามารถพิจารณาได้ว่ากำลังทำงานในภาษาระดับสูง เนื่องจากโปรแกรมเมอร์เหล่านั้นไม่ได้ทำงานกับองค์ประกอบเชิงแนวคิดระดับต่ำสุดของคอมพิวเตอร์ เพื่อเน้นย้ำประเด็นนี้ มีการใช้มาโครเพื่อใช้งานเครื่องเสมือน รุ่นแรก ในSNOBOL4 (1967) ซึ่งเขียนด้วยภาษาการใช้งาน SNOBOL (SIL) ซึ่งเป็นภาษาแอสเซมบลีสำหรับเครื่องเสมือน เครื่องเป้าหมายจะแปลสิ่งนี้เป็นโค้ดเนทีฟโดยใช้ แอสเซมเบลอ ร์มาโคร[ 32 ]ซึ่งทำให้สามารถพกพาได้ในระดับสูงในเวลานั้น
ในยุคเมนเฟรม มีการใช้มาโครเพื่อปรับแต่งระบบซอฟต์แวร์ขนาดใหญ่ให้เหมาะสมกับลูกค้าเฉพาะกลุ่ม และยังถูกใช้โดยบุคลากรของลูกค้าเพื่อตอบสนองความต้องการของนายจ้างโดยการสร้างระบบปฏิบัติการของผู้ผลิตในเวอร์ชันเฉพาะ ตัวอย่างเช่น โปรแกรมเมอร์ระบบที่ทำงานกับระบบ Conversational Monitor System / Virtual Machine ( VM/CMS ) ของ IBMและส่วนเสริม "การประมวลผลธุรกรรมแบบเรียลไทม์" ของ IBM เช่น Customer Information Control System (CICS ) และACP / TPF ซึ่งเป็นระบบสายการบิน/การเงินที่เริ่มต้นในทศวรรษ 1970 และยังคงใช้งานอยู่ ในระบบการจองด้วยคอมพิวเตอร์ขนาดใหญ่ (CRS) และระบบบัตรเครดิตจำนวนมากในปัจจุบัน
นอกจากนี้ ยังสามารถใช้ความสามารถในการประมวลผลมาโครของแอสเซมเบลอร์เพียงอย่างเดียวในการสร้างโค้ดที่เขียนด้วยภาษาที่แตกต่างกันอย่างสิ้นเชิงได้ ตัวอย่างเช่น การสร้างโปรแกรมเวอร์ชันหนึ่งในภาษาCOBOLโดยใช้โปรแกรมแอสเซมเบลอร์แบบมาโครล้วนๆ ที่มีโค้ด COBOL อยู่ภายในตัวดำเนินการเวลาแอสเซมบลี ซึ่งสั่งให้แอสเซมเบลอร์สร้างโค้ดตามอำเภอใจ ระบบปฏิบัติการ IBM OS/360ใช้มาโครในการสร้างระบบผู้ใช้ระบุตัวเลือกต่างๆ โดยการเขียนโค้ดมาโครแอสเซมเบลอร์หลายชุด การประกอบมาโครเหล่านี้จะสร้างกระแสงานเพื่อสร้างระบบ ซึ่งรวมถึงภาษาควบคุมงานและคำสั่งควบคุมยูทิลิตี้
นี่เป็นเพราะว่า ดังที่ได้ตระหนักกันในทศวรรษ 1960 แนวคิดของ "การประมวลผลมาโคร" นั้นเป็นอิสระจากแนวคิดของ "ภาษาแอสเซมบลี" โดยในแง่สมัยใหม่ การประมวลผลมาโครนั้นเป็นเหมือนการประมวลผลคำหรือข้อความมากกว่าการสร้างโค้ดวัตถุ แนวคิดของการประมวลผลมาโครปรากฏขึ้นและยังคงปรากฏอยู่ในภาษาโปรแกรม C ซึ่งรองรับ "คำสั่งพรีโปรเซสเซอร์" เพื่อกำหนดค่าตัวแปรและทำการทดสอบเงื่อนไขบนค่าของตัวแปรเหล่านั้น แตกต่างจากโปรเซสเซอร์มาโครก่อนหน้านี้บางตัวภายในภาษาแอสเซมบลี พรีโปรเซสเซอร์ของภาษา C ไม่ใช่เครื่องจักรทัวริงที่สมบูรณ์แบบ (Turing-complete)เพราะมันขาดความสามารถในการวนซ้ำหรือ "ไปที่" ซึ่งอย่างหลังนี้จะช่วยให้โปรแกรมสามารถวนซ้ำได้
แม้ว่าการประมวลผลมาโครจะมีประสิทธิภาพสูง แต่ก็ไม่ค่อยได้ใช้ในภาษาโปรแกรมระดับสูงหลายภาษา (ยกเว้นภาษาC , C++และ PL/I) ในขณะที่ยังคงใช้กันอย่างแพร่หลายในภาษาแอสเซมบลี
การแทนที่พารามิเตอร์ในมาโครนั้นเป็นไปตามชื่ออย่างเคร่งครัด: ในระหว่างการประมวลผลมาโคร ค่าของพารามิเตอร์จะถูกแทนที่ด้วยชื่อของมันในเชิงข้อความ ข้อผิดพลาดที่เกิดขึ้นบ่อยที่สุดคือการใช้พารามิเตอร์ที่เป็นนิพจน์ ไม่ใช่ชื่อธรรมดา เมื่อผู้เขียนมาโครคาดหวังชื่อ ในมาโคร:
foo: มาโคร a โหลด a*b
เจตนาคือผู้เรียกจะระบุชื่อตัวแปร และตัวแปรหรือค่าคงที่ "ส่วนกลาง" b จะถูกใช้เพื่อคูณ "a" หาก foo ถูกเรียกด้วยพารามิเตอร์a-cการขยายมาโครของload a-c*bจะเกิดขึ้น เพื่อหลีกเลี่ยงความกำกวมใดๆ ผู้ใช้ตัวประมวลผลมาโครสามารถใส่วงเล็บพารามิเตอร์อย่างเป็นทางการภายในคำจำกัดความของมาโคร หรือผู้เรียกสามารถใส่วงเล็บพารามิเตอร์อินพุตได้[ 33 ]
การสนับสนุนการเขียนโปรแกรมเชิงโครงสร้าง
มีการเขียนแพ็กเกจมาโครที่จัดเตรียม องค์ประกอบ การเขียนโปรแกรมเชิงโครงสร้างเพื่อเข้ารหัสการไหลของการดำเนินการ ตัวอย่างแรกสุดของแนวทางนี้คือชุดมาโคร Concept-14 [ 34 ]ซึ่งเสนอโดยHarlan Mills (มีนาคม 1970) และนำไปใช้โดย Marvin Kessler ที่แผนก Federal Systems ของ IBM ซึ่งจัดเตรียม IF/ELSE/ENDIF และบล็อกควบคุมการไหลที่คล้ายกันสำหรับโปรแกรมแอสเซมเบลอร์ OS/360 นี่เป็นวิธีหนึ่งในการลดหรือกำจัดการใช้การ ดำเนินการ GOTOในโค้ดแอสเซมบลี ซึ่งเป็นหนึ่งในปัจจัยหลักที่ทำให้เกิดโค้ดสปาเก็ตตี้ในภาษาแอสเซมบลี แนวทางนี้ได้รับการยอมรับอย่างกว้างขวางในช่วงต้นทศวรรษ 1980 (ช่วงปลายของการใช้ภาษาแอสเซมบลีขนาดใหญ่) ชุดเครื่องมือ High Level Assembler Toolkit ของ IBM [ 35 ]มีแพ็กเกจมาโครดังกล่าว
การออกแบบอีกอย่างหนึ่งคือ A-Natural [ 36 ]ซึ่งเป็นแอสเซมเบลอร์แบบ "เน้นสตรีม" สำหรับโปรเซสเซอร์ 8080/ Z80จากWhitesmiths Ltd. (ผู้พัฒนา ระบบปฏิบัติการ Idrisที่คล้ายUnixและสิ่งที่ได้รับการรายงานว่าเป็นคอมไพเลอร์C เชิงพาณิชย์ตัวแรก ) ภาษาดังกล่าวถูกจัดประเภทเป็นแอสเซมเบลอร์เนื่องจากทำงานกับองค์ประกอบเครื่องจักรดิบ เช่นโอเปอเรเตอร์รีจิสเตอร์และการอ้างอิงหน่วยความจำ แต่ได้รวมไวยากรณ์นิพจน์เพื่อระบุลำดับการดำเนินการ วงเล็บและสัญลักษณ์พิเศษอื่นๆ พร้อมกับโครงสร้างการเขียนโปรแกรมแบบบล็อกที่เน้นบล็อก ควบคุมลำดับของคำสั่งที่สร้างขึ้น A-Natural ถูกสร้างขึ้นเป็นภาษาวัตถุของคอมไพเลอร์ C มากกว่าสำหรับการเขียนโค้ดด้วยมือ แต่ไวยากรณ์เชิงตรรกะของมันก็ได้รับความนิยม
นับตั้งแต่การพัฒนาภาษาแอสเซมบลีขนาดใหญ่ลดลง ความต้องการแอสเซมเบลอร์ที่ซับซ้อนมากขึ้นก็ลดลงอย่างเห็นได้ชัด[ 37 ]ถึงกระนั้นก็ตาม แอสเซมเบลอร์เหล่านี้ก็ยังคงได้รับการพัฒนาและนำไปใช้ในกรณีที่ข้อจำกัดด้านทรัพยากรหรือลักษณะเฉพาะในสถาปัตยกรรมของระบบเป้าหมายทำให้ไม่สามารถใช้ภาษาระดับสูงได้อย่างมีประสิทธิภาพ[ 38 ]
โปรแกรมแอสเซมเบลอร์ที่มีกลไกมาโครที่ทรงพลังช่วยให้สามารถเขียนโปรแกรมแบบมีโครงสร้างผ่านมาโครได้ เช่น มาโคร switch ที่มาพร้อมกับแพ็คเกจ Masm32 (โค้ดนี้เป็นโปรแกรมที่สมบูรณ์):
รวมไฟล์masm32 และรวมไฟล์masm32rt.inc ; ใช้ไลบรารี Masm32.code demomain: REPEAT 20 switch rv ( nrandom , 9 ) ; สร้างตัวเลขระหว่าง 0 ถึง 8 mov ecx , 7 case 0 print "case 0" case ecx ; แตกต่างจากภาษาโปรแกรมอื่นๆ ส่วนใหญ่print "case 7" ; สวิตช์ Masm32 อนุญาตให้มี "กรณีที่เปลี่ยนแปลงได้" case 1 .. 3 .if eax == 1 print "case 1" .elseif eax == 2 print "case 2" .else print "cases 1 to 3: other" .endif case 4 , 6 , 8 print "cases 4, 6 or 8" default mov ebx , 19 ; พิมพ์เครื่องหมายดอกจัน 20 ตัว.Repeat print "*" dec ebx .Until Sign? ; วนลูปจนกว่าแฟล็กเครื่องหมายจะถูกตั้งค่าสิ้นสุดการพิมพ์chr$ ( 13 , 10 ) สิ้นสุด M ออกสิ้นสุดdemomainการใช้ภาษาแอสเซมบลี
เมื่อ มีการนำ คอมพิวเตอร์แบบจัดเก็บโปรแกรมมาใช้โปรแกรมจะถูกเขียนด้วยรหัสเครื่อง และโหลดเข้าสู่คอมพิวเตอร์จากเทปกระดาษเจาะรู หรือสลับเข้าสู่หน่วยความจำโดยตรงจากสวิตช์คอนโซลKathleen Booth "ได้รับการยกย่องว่าเป็นผู้คิดค้นภาษาแอสเซมบลี" [ 39 ] [ 40 ]โดยอิงจากงานเชิงทฤษฎีที่เธอเริ่มต้นในปี 1947 ขณะทำงานเกี่ยวกับARC2ที่Birkbeck มหาวิทยาลัยลอนดอนหลังจากที่Andrew Booth (ซึ่งต่อมาเป็นสามีของเธอ) ได้ปรึกษากับนักคณิตศาสตร์John von Neumannและนักฟิสิกส์Herman Goldstineที่Institute for Advanced Study [ 40 ] [ 41 ]
ในช่วงปลายปี พ.ศ. 2491 เครื่องคำนวณอัตโนมัติแบบหน่วงเวลาอิเล็กทรอนิกส์ (EDSAC) มีแอสเซมเบลอร์ (ชื่อ "คำสั่งเริ่มต้น") ที่รวมอยู่ใน โปรแกรม บูตสแตรปโดยใช้ตัวย่อตัวอักษรเดียวที่พัฒนาโดยDavid Wheelerซึ่งได้รับการยกย่องจากIEEE Computer Societyว่าเป็นผู้สร้าง "แอสเซมเบลอร์" ตัวแรก[ 21 ] [ 42 ] [ 43 ]รายงานเกี่ยวกับ EDSAC ได้แนะนำคำว่า "แอสเซมบลี" สำหรับกระบวนการรวมฟิลด์เข้าเป็นคำสั่ง[ 44 ] SOAP ( Symbolic Optimal Assembly Program ) เป็นภาษาแอสเซมบลีสำหรับ คอมพิวเตอร์ IBM 650ที่เขียนโดย Stan Poley ในปี พ.ศ. 2498 [ 45 ]
ภาษาแอสเซมบลีช่วยขจัดข้อผิดพลาดที่เกิดขึ้นได้ง่าย ความยุ่งยาก และการเสียเวลาใน การเขียนโปรแกรม รุ่นแรกๆที่จำเป็นสำหรับคอมพิวเตอร์รุ่นแรกๆ ทำให้โปรแกรมเมอร์ไม่ต้องจำรหัสตัวเลขและคำนวณที่อยู่ ครั้งหนึ่งเคยมีการใช้กันอย่างแพร่หลายในการเขียนโปรแกรมทุกประเภท แต่ในช่วงปลายทศวรรษ 1950 การใช้งานส่วนใหญ่ถูกแทนที่ด้วยภาษาโปรแกรมระดับสูงกว่าเพื่อค้นหาประสิทธิภาพการเขียนโปรแกรมที่ ดีขึ้น [ 46 ]ปัจจุบัน ภาษาแอสเซมบลียังคงใช้สำหรับการจัดการฮาร์ดแวร์โดยตรง การเข้าถึงคำสั่งโปรเซสเซอร์เฉพาะ หรือเพื่อแก้ไขปัญหาประสิทธิภาพที่สำคัญ[ 47 ]การใช้งานทั่วไป ได้แก่ไดรเวอร์อุปกรณ์ระบบฝังตัวระดับต่ำและ ระบบ เรียลไทม์ (ดู§ การใช้งานในปัจจุบัน )
โปรแกรมจำนวนมากถูกเขียนขึ้นโดยใช้ภาษาแอสเซมบลีทั้งหมด คอมพิวเตอร์Burroughs MCP (ปี 1961) เป็นคอมพิวเตอร์เครื่องแรกที่ระบบปฏิบัติการไม่ได้ถูกพัฒนาขึ้นโดยใช้ภาษาแอสเซมบลีทั้งหมด แต่เขียนขึ้นด้วยภาษา Executive Systems Problem Oriented Language (ESPOL) ซึ่งเป็นภาษาในตระกูล Algol แอปพลิเคชันเชิงพาณิชย์จำนวนมากก็ถูกเขียนขึ้นด้วยภาษาแอสเซมบลีเช่นกัน รวมถึงซอฟต์แวร์ เมนเฟรมของ IBMจำนวนมากที่พัฒนาโดยบริษัทขนาดใหญ่ ในที่สุด COBOL , FORTRANและ PL/I บางส่วนก็เข้ามาแทนที่ภาษาแอสเซมบลี แม้ว่าจะมีองค์กรขนาดใหญ่จำนวนหนึ่งที่ยังคงใช้โครงสร้างพื้นฐานแอปพลิเคชันที่เขียนด้วยภาษาแอสเซมบลีต่อไปจนถึงช่วงทศวรรษ 1990
ภาษาแอสเซมบลีเป็นภาษาพัฒนาหลักสำหรับคอมพิวเตอร์บ้าน 8 บิต เช่นApple II , คอมพิวเตอร์ Atari 8 บิต , ZX SpectrumและCommodore 64ภาษาBASIC ที่ใช้การตีความ บนระบบเหล่านี้ไม่ได้ให้ความเร็วในการประมวลผลสูงสุดและการใช้สิ่งอำนวยความสะดวกอย่างเต็มที่เพื่อใช้ประโยชน์จากฮาร์ดแวร์ที่มีอยู่ ภาษาแอสเซมบลีเป็นตัวเลือกเริ่มต้นสำหรับการเขียนโปรแกรมคอนโซล 8 บิต เช่นAtari 2600และNintendo Entertainment System [ 48 ]
ซอฟต์แวร์หลักสำหรับเครื่องคอมพิวเตอร์ที่เข้ากันได้กับ IBM PCเช่นMS-DOS , Turbo Pascalและ โปรแกรมสเปรดชีต Lotus 1-2-3เขียนด้วยภาษาแอสเซมบลี เมื่อความเร็วของคอมพิวเตอร์เพิ่มขึ้นอย่างรวดเร็ว ภาษาแอสเซมบลีจึงกลายเป็นเครื่องมือสำหรับเร่งความเร็วส่วนต่างๆ ของโปรแกรม เช่น การแสดงผลของDoom มากกว่าที่จะ เป็นภาษาพัฒนาหลัก ในช่วงทศวรรษ 1990 ภาษาแอสเซมบลีถูกใช้เพื่อเพิ่มประสิทธิภาพสูงสุดให้กับระบบต่างๆ เช่นSega Saturn [ 49 ]และเป็นภาษาหลักสำหรับฮาร์ดแวร์เกมอาร์เคดที่ใช้ CPU/GPU แบบรวม TMS34010เช่นMortal KombatและNBA Jam
การใช้งานปัจจุบัน
มีการถกเถียงกันถึงประโยชน์และประสิทธิภาพของภาษาแอสเซมบลีเมื่อเทียบกับภาษาระดับสูง[ 50 ]
แม้ว่าภาษาแอสเซมบลีจะมีการใช้งานเฉพาะกลุ่มที่สำคัญ (ดูด้านล่าง) แต่ก็ยังมีเครื่องมืออื่นๆ สำหรับการเพิ่มประสิทธิภาพ[ 51 ]
ข้อมูล ณ เดือนกรกฎาคม2560 ตัวอย่างเช่นดัชนีTIOBEของความนิยมภาษาโปรแกรมจัดอันดับภาษาแอสเซมบลีไว้ที่อันดับ 11 นำหน้าVisual Basic [ 52 ]แอสเซมเบลอร์สามารถใช้เพื่อเพิ่มประสิทธิภาพความเร็วหรือเพิ่มประสิทธิภาพขนาด ในกรณีของการเพิ่มประสิทธิภาพความเร็วมีการอ้างว่าคอมไพเลอร์ที่เพิ่มประสิทธิภาพ สมัยใหม่ [ 53 ]แปลงภาษาโปรแกรมระดับสูงให้เป็นโค้ดที่สามารถทำงานได้เร็วเท่ากับแอสเซมบลีที่เขียนด้วยมือ แม้จะมีตัวอย่างที่ขัดแย้งอยู่บ้างก็ตาม[ 54 ] [ 55 ] [ 56 ]ความซับซ้อนของโปรเซสเซอร์และระบบย่อยหน่วยความจำสมัยใหม่ทำให้การเพิ่มประสิทธิภาพที่มีประสิทธิภาพทำได้ยากขึ้นเรื่อยๆ สำหรับทั้งคอมไพเลอร์และโปรแกรมเมอร์แอสเซมบลี[ 57 ] [ 58 ]ประสิทธิภาพของโปรเซสเซอร์ที่เพิ่มขึ้นหมายความว่า CPU ส่วนใหญ่จะไม่ได้ใช้งานเป็นส่วนใหญ่[ 59 ]โดยมีความล่าช้าที่เกิดจากคอขวดที่คาดการณ์ได้ เช่น การพลาดแคช การดำเนินการ I/Oและการเพจจิ้งทำให้ความเร็วในการดำเนินการโค้ดดิบไม่ใช่ปัญหาสำหรับโปรแกรมเมอร์หลายคน
ยังมีบางสาขาการเขียนโปรแกรมคอมพิวเตอร์ที่การใช้ภาษาแอสเซมบลียังคงเป็นเรื่องปกติ:
- การเขียนโค้ดสำหรับระบบที่มีโปรเซสเซอร์รุ่นเก่าซึ่งมีตัวเลือกภาษาขั้นสูงจำกัด เช่นAtari 2600 , Commodore 64และเครื่องคิดเลขกราฟิก [ 60 ] โปรแกรมสำหรับคอมพิวเตอร์เหล่านี้ในช่วงทศวรรษ 1970 และ 1980 มักถูกเขียนขึ้นในบริบทของวัฒนธรรมย่อยdemosceneหรือretrogaming
- โค้ดที่ต้องโต้ตอบโดยตรงกับฮาร์ดแวร์ เช่น ในไดรเวอร์อุปกรณ์และ ตัว จัดการการขัดจังหวะ
- ในโปรเซสเซอร์แบบฝังตัวหรือDSPการขัดจังหวะที่มีความถี่สูงต้องการจำนวนรอบการทำงานต่อการขัดจังหวะที่สั้นที่สุด เช่น การขัดจังหวะที่เกิดขึ้น 1,000 หรือ 10,000 ครั้งต่อวินาที
- โปรแกรมที่จำเป็นต้องใช้คำสั่งเฉพาะของโปรเซสเซอร์ซึ่งไม่ได้ถูกนำมาใช้ในคอมไพเลอร์ ตัวอย่างที่พบได้ทั่วไปคือ คำสั่ง การหมุนบิตซึ่งเป็นหัวใจสำคัญของอัลกอริธึมการเข้ารหัสหลายอย่าง รวมถึงการตรวจสอบพาริตีของไบต์หรือตัวทด 4 บิตของการบวก
- ไฟล์ปฏิบัติการแบบสแตนด์อะโลนที่จำเป็นต้องทำงานโดยไม่ต้องอาศัย ส่วนประกอบ รันไทม์หรือไลบรารีที่เกี่ยวข้องกับภาษาโปรแกรมระดับสูง เช่น เฟิร์มแวร์สำหรับโทรศัพท์ ระบบเชื้อเพลิงและจุดระเบิดของรถยนต์ ระบบควบคุมเครื่องปรับอากาศ และระบบรักษาความปลอดภัย
- โปรแกรมที่มีลูปภายในที่ไวต่อประสิทธิภาพ ซึ่งภาษาแอสเซมบลีให้โอกาสในการเพิ่มประสิทธิภาพที่ยากจะบรรลุได้ในภาษาระดับสูง ตัวอย่างเช่นพีชคณิตเชิงเส้นด้วยBLAS [ 54 ] [ 61 ]หรือการแปลงโคไซน์แบบไม่ต่อเนื่อง (เช่น เวอร์ชันแอสเซมบลี SIMDจากx264 [ 62 ] )
- โปรแกรมที่สร้างฟังก์ชันเวกเตอร์สำหรับโปรแกรมในภาษาโปรแกรมระดับสูง เช่น ภาษาซี ในภาษาโปรแกรมระดับสูงนั้น บางครั้งจะใช้ฟังก์ชันภายในของ คอมไพเลอร์ช่วย ซึ่งแมปโดยตรงกับตัวย่อ SIMD แต่ถึงกระนั้นก็ยังส่งผลให้เกิดการแปลงเป็นภาษาแอสเซมบลีแบบหนึ่งต่อหนึ่งที่เฉพาะเจาะจงสำหรับโปรเซสเซอร์เวกเตอร์ที่กำหนด
- โปรแกรม แบบเรียลไทม์เช่น การจำลองสถานการณ์ ระบบนำทางในการบิน และอุปกรณ์ทางการแพทย์ ตัวอย่างเช่น ในระบบควบคุมการบินด้วยไฟฟ้า (fly-by-wire)ข้อมูลโทรมาตรจะต้องได้รับการตีความและดำเนินการภายในข้อจำกัดด้านเวลาที่เข้มงวด ระบบดังกล่าวต้องกำจัดแหล่งที่มาของความล่าช้าที่ไม่สามารถคาดเดาได้ ซึ่งอาจเกิดจากภาษาที่ใช้การตีความ การจัดการหน่วยความจำ อัตโนมัติ การดำเนินการเพจจิ้ง หรือการทำงานหลายอย่างพร้อมกันแบบ แย่งชิง การเลือกใช้ภาษาแอสเซมบลีหรือภาษาในระดับต่ำกว่าสำหรับระบบดังกล่าวช่วยให้นักโปรแกรมมองเห็นและควบคุมรายละเอียดการประมวลผลได้มากขึ้น
- อัลกอริทึมการเข้ารหัสลับที่ต้องใช้เวลาประมวลผลเท่ากันเสมอ เพื่อป้องกันการโจมตีโดยอาศัยเวลาในการประมวลผล (timing attack )
- ตัวเข้ารหัสและถอดรหัสวิดีโอ เช่น rav1e (ตัวเข้ารหัสสำหรับAV1 ) [ 63 ]และ dav1d (ตัวถอดรหัสอ้างอิงสำหรับ AV1) [ 64 ]มีภาษาแอสเซมบลีเพื่อใช้ประโยชน์จาก คำสั่ง AVX2และARM Neonเมื่อมีให้ใช้งาน
- แก้ไขและขยายโค้ดเดิมที่เขียนขึ้นสำหรับคอมพิวเตอร์เมนเฟรมของ IBM [ 65 ] [ 66 ]
- สถานการณ์ที่จำเป็นต้องควบคุมสภาพแวดล้อมอย่างสมบูรณ์ ในสถานการณ์ที่มีความปลอดภัยสูงมากซึ่งไม่สามารถประมาทได้เลย
- ไวรัสคอมพิวเตอร์ , บูตโหลดเดอร์ , ไดรเวอร์อุปกรณ์ บางตัว หรือสิ่งอื่น ๆ ที่เกี่ยวข้องกับฮาร์ดแวร์หรือระบบปฏิบัติการระดับต่ำมาก
- โปรแกรมจำลองชุดคำสั่งสำหรับตรวจสอบ ติดตาม และแก้ไขข้อผิดพลาด โดยลดภาระการทำงานเพิ่มเติมให้น้อยที่สุด
- สถานการณ์ที่ไม่มีภาษาโปรแกรมระดับสูง หรือบนโปรเซสเซอร์ใหม่หรือเฉพาะทางที่ไม่มีคอมไพเลอร์แบบครอสโอเวอร์ให้ใช้งาน
- การวิศวกรรมย้อนกลับและการแก้ไขไฟล์โปรแกรม เช่น:
- ไฟล์ไบนารีที่มีอยู่ซึ่งอาจเขียนขึ้นด้วยภาษาโปรแกรมระดับสูงหรือไม่ก็ได้ ตัวอย่างเช่น เมื่อพยายามสร้างโปรแกรมขึ้นใหม่ในกรณีที่ไม่มีซอร์สโค้ดหรือซอร์สโค้ดสูญหาย หรือการถอดรหัสการป้องกันการคัดลอกของซอฟต์แวร์ที่เป็นกรรมสิทธิ์
- การแฮ็ก ROM ในวิดีโอเกม (หรือเรียกอีกอย่างว่าROM hacking ) สามารถทำได้หลายวิธี วิธีที่ใช้กันอย่างแพร่หลายที่สุดคือการแก้ไขโค้ดโปรแกรมในระดับภาษาแอสเซมบลี
ภาษาแอสเซมบลียังคงถูกสอนใน หลักสูตร วิทยาการคอมพิวเตอร์และวิศวกรรมอิเล็กทรอนิกส์ ส่วนใหญ่ แม้ว่าโปรแกรมเมอร์ในปัจจุบันจะไม่ค่อยได้ใช้ภาษาแอสเซมบลีเป็นเครื่องมือในการทำงานเป็นประจำ แต่แนวคิดพื้นฐานยังคงมีความสำคัญ หัวข้อพื้นฐานต่างๆ เช่นเลขคณิตไบนารีการจัดสรรหน่วยความจำการประมวลผลสแต็กการเข้ารหัสชุด อักขระ การประมวลผล การขัดจังหวะและ การออกแบบ คอมไพเลอร์จะเป็นเรื่องยากที่จะศึกษาในรายละเอียดหากไม่เข้าใจวิธีการทำงานของคอมพิวเตอร์ในระดับฮาร์ดแวร์ เนื่องจากพฤติกรรมของคอมพิวเตอร์ถูกกำหนดโดยพื้นฐานจากชุดคำสั่ง วิธีการเรียนรู้แนวคิดดังกล่าวอย่างมีเหตุผลคือการศึกษาภาษาแอสเซมบลี คอมพิวเตอร์สมัยใหม่ส่วนใหญ่มีชุดคำสั่งที่คล้ายคลึงกัน ดังนั้น การศึกษาภาษาแอสเซมบลีเพียงภาษาเดียวก็เพียงพอที่จะเรียนรู้แนวคิดพื้นฐาน ตระหนักถึงสถานการณ์ที่การใช้ภาษาแอสเซมบลีอาจเหมาะสม และเห็นว่าสามารถสร้างโค้ดที่ทำงานได้ที่มีประสิทธิภาพจากภาษาระดับสูงได้อย่างไร[ 24 ]
การใช้งานทั่วไป
- โดยทั่วไป ภาษาแอสเซมบลีจะใช้ในโค้ด บูตของระบบซึ่งเป็นโค้ดระดับต่ำที่เริ่มต้นและทดสอบฮาร์ดแวร์ของระบบก่อนที่จะบูตระบบปฏิบัติการ และมักจะถูกจัดเก็บไว้ในROM ( BIOSบน ระบบ พีซีที่เข้ากันได้กับ IBMและCP/Mเป็นตัวอย่างหนึ่ง)
- ภาษาแอสเซมบลีมักใช้สำหรับโค้ดระดับต่ำ ตัวอย่างเช่น สำหรับเคอร์เนลของระบบปฏิบัติการซึ่งไม่สามารถพึ่งพาการเรียกใช้ระบบที่มีอยู่แล้วได้ และต้องเขียนโค้ดการเรียกใช้ระบบเหล่านั้นให้เหมาะสมกับสถาปัตยกรรมของโปรเซสเซอร์ที่ระบบจะทำงานอยู่
- คอมไพเลอร์บางตัวจะแปลงภาษาโปรแกรมระดับสูงเป็นภาษาแอสเซมบลีก่อนที่จะคอมไพล์อย่างสมบูรณ์ ทำให้สามารถดูโค้ดแอสเซมบลีเพื่อใช้ในการดีบักและเพิ่มประสิทธิภาพได้
- คอมไพเลอร์บางตัวสำหรับภาษาโปรแกรมระดับต่ำ เช่นPascalหรือCอนุญาตให้โปรแกรมเมอร์ฝังภาษาแอสเซมบลีลงในซอร์สโค้ดโดยตรง (เรียกว่าinline assembly ) โปรแกรมที่ใช้ฟังก์ชันดังกล่าวสามารถสร้างนามธรรมโดยใช้ภาษาแอสเซมบลีที่แตกต่างกันในแต่ละแพลตฟอร์มฮาร์ดแวร์ได้ จากนั้น โค้ดที่พกพาได้ของระบบสามารถใช้ส่วนประกอบเฉพาะของโปรเซสเซอร์เหล่านี้ผ่านอินเทอร์เฟซที่เป็นมาตรฐานเดียวกัน
- ภาษาแอสเซมบลีมีประโยชน์ในการวิศวกรรมย้อนกลับโปรแกรมจำนวนมากถูกเผยแพร่ในรูปแบบรหัสเครื่องเท่านั้น ซึ่งสามารถแปลงเป็นภาษาแอสเซมบลีได้ง่ายโดย ใช้ โปรแกรมถอดรหัสแต่ยากกว่าที่จะแปลงเป็นภาษาระดับสูงกว่าโดยใช้โปรแกรมถอดรหัสเครื่องมืออย่างเช่นInteractive Disassemblerใช้ประโยชน์จากการถอดรหัสอย่างกว้างขวางเพื่อจุดประสงค์ดังกล่าว เทคนิคนี้ถูกใช้โดยแฮกเกอร์เพื่อเจาะซอฟต์แวร์เชิงพาณิชย์ และคู่แข่งใช้เพื่อสร้างซอฟต์แวร์ที่มีผลลัพธ์คล้ายคลึงกันจากบริษัทคู่แข่ง
- ภาษาแอสเซมบลีถูกใช้เพื่อเพิ่มความเร็วในการประมวลผล โดยเฉพาะในคอมพิวเตอร์ส่วนบุคคลรุ่นแรกๆ ที่มีกำลังประมวลผลและหน่วยความจำ RAM จำกัด
- สามารถใช้แอสเซมเบลอร์เพื่อสร้างบล็อกข้อมูลโดยไม่มีค่าใช้จ่ายด้านภาษาขั้นสูงจากซอร์สโค้ดที่จัดรูปแบบและมีคำอธิบายประกอบเพื่อนำไปใช้โดยโค้ดอื่น[ 67 ] [ 68 ]
ดูเพิ่มเติม
- คอมไพเลอร์– ซอฟต์แวร์ที่แปลงโค้ดจากภาษาโปรแกรมหนึ่งไปเป็นอีกภาษาหนึ่ง
- การเปรียบเทียบแอสเซมเบลอร์
- โปรแกรม ถอดรหัส– โปรแกรมคอมพิวเตอร์ที่ใช้แปลภาษาเครื่องเป็นภาษาแอสเซมบลี
- เลขฐานสิบหก– การแสดงตัวเลขในระบบฐาน 16
- ภาษาประมวลผลข้อมูล– ภาษาโปรแกรมยุคแรกสำหรับการสร้างรายการ
- สถาปัตยกรรมชุดคำสั่ง– แบบจำลองที่อธิบายอินเทอร์เฟซที่สามารถตั้งโปรแกรมได้ของหน่วยประมวลผลคอมพิวเตอร์
- รายชื่อซอฟต์แวร์และเครื่องมือประกอบ
- คอมพิวเตอร์จำลองขนาดเล็ก– แบบจำลองการสอนการใช้งานคอมพิวเตอร์หน้าต่างๆ แสดงคำอธิบายสั้นๆ ของเป้าหมายการเปลี่ยนเส้นทาง
- นิบเบิล– หน่วยข้อมูลไบนารีสี่บิต
- ภาษาแอสเซมบลีแบบมีชนิดข้อมูล– ทฤษฎีภาษาโปรแกรม
หมายเหตุ
- ↑นอกเหนือจากเมตาแอสเซมเบลอร์
- ↑อย่างไรก็ตาม นั่นไม่ได้หมายความว่าโปรแกรมแอสเซมเบลอร์ที่ใช้ภาษาเหล่านั้นจะเป็นโปรแกรมสากล
- ↑นี่เป็นหนึ่งในสองรูปแบบที่ซ้ำซ้อนของคำสั่งนี้ซึ่งทำงานเหมือนกันทุกประการ ซีพียู 8086 และซีพียูอื่นๆ อีกหลายตัวจากช่วงปลายทศวรรษ 1970/ต้นทศวรรษ 1980 มีคำสั่งที่ซ้ำซ้อนในชุดคำสั่ง เนื่องจากวิศวกรออกแบบซีพียูเหล่านี้ (เพื่อให้พอดีกับชิปซิลิคอนที่มีขนาดจำกัด) ได้ง่ายกว่าการกำจัดรหัสที่ซ้ำซ้อนออกไป (ดูคำศัพท์ที่ไม่สนใจ ) โดยทั่วไปแล้ว ตัวประกอบคำสั่งแต่ละตัวจะสร้างการเข้ารหัสคำสั่งที่ซ้ำซ้อนเพียงหนึ่งในสองหรือมากกว่านั้น แต่ตัวถอดรหัสคำสั่งมักจะรู้จักการเข้ารหัสใดๆ ก็ได้
- ↑ AMD ผลิตซีพียู Intel 8086, 8088 และ 80286 และอาจรวมถึง 8080A และ 8085A ด้วย ภายใต้ใบอนุญาตจาก Intel แต่เริ่มตั้งแต่รุ่น 80386 เป็นต้นไป Intel ปฏิเสธที่จะแบ่งปันการออกแบบซีพียู x86 กับใคร — AMD จึงฟ้องร้องในข้อหาละเมิดสัญญา —และ AMD ได้ออกแบบ ผลิต และจำหน่ายซีพียูตระกูล x86 ทั้งแบบ 32 บิตและ 64 บิต โดยปราศจากความช่วยเหลือหรือการรับรองจาก Intel
- ↑ใน 7070 Autocoder คำจำกัดความของมาโครคือโปรแกรมสร้างมาโคร 7070 ที่แอสเซมเบลอร์เรียกใช้ โดย Autocoder จะจัดเตรียมมาโครพิเศษสำหรับโปรแกรมสร้างมาโครเพื่อใช้งาน
- 1 2 "ภาษาแอสเซมเบลอร์"แอสเซมเบลอร์ระดับสูงสำหรับ z/OS & z/VM & z/VSE เอกสารอ้างอิงภาษา เวอร์ชัน 1 รุ่น 6 IBM 2014 [1990] SC26-4940-06
- ↑ "Assembly: Review" (PDF) . ภาควิชาวิทยาการคอมพิวเตอร์และวิศวกรรมศาสตร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยโอไฮโอสเตท . 2016. เก็บถาวร(PDF)จากต้นฉบับเมื่อ 2020-03-24 . เรียกดูเมื่อ2020-03-24 .
- ↑อาร์เชอร์, เบนจามิน (พฤศจิกายน 2016). ภาษาแอสเซมบลีสำหรับนักเรียน . นอร์ทชาร์ลสตัน, เซาท์แคโรไลนา, สหรัฐอเมริกา: สำนักพิมพ์อิสระ CreateSpace . ISBN 978-1-5403-7071-6
ภาษาแอสเซมบลีอาจเรียกว่ารหัสเครื่องเชิงสัญลักษณ์ได้เช่น
กัน - ↑ Streib, James T. (2020). "คู่มือภาษาแอสเซมบลี". หัวข้อระดับปริญญาตรีในวิทยาการคอมพิวเตอร์ . Cham: Springer International Publishing. doi : 10.1007/978-3-030-35639-2 . ISBN 978-3-030-35638-5ISSN 1863-7310 S2CID 195930813 การเขียนโปรแกรมด้วยภาษาแอสเซ ม บ ลี มีข้อดีเช่นเดียวกับการเขียนโปรแกรมด้วยภาษาเครื่อง ยกเว้น ว่า
มันง่ายกว่า
- ↑ Saxon, James A.; Plette, William S. (1962). การเขียนโปรแกรม IBM 1401 คู่มือการเขียนโปรแกรมแบบเรียนรู้ด้วยตนเอง Englewood Cliffs, New Jersey, สหรัฐอเมริกา: Prentice-Hall . LCCN 62-20615 . (หมายเหตุ: การใช้คำว่าโปรแกรมแอสเซมบ ลี )
- ↑ Kornelis, AF (2010) [2003]. "High Level Assembler – Opcodes overview, Assembler Directives" . เก็บถาวรจากต้นฉบับเมื่อ 2020-03-24 . เรียกดูเมื่อ2020-03-24 .
- ↑ "คำสั่งมาโคร" . คู่มืออ้างอิงภาษาแอสเซมเบลอร์ระดับสูงสำหรับ z/OS & z/VM & z/VSE เวอร์ชัน 1 รุ่น 6 . IBM . 2014 [1990]. SC26-4940-06.
- ↑ Booth, Andrew D; Britten, Kathleen HV (1947). การเข้ารหัสสำหรับ ARC (PDF)สถาบันเพื่อการศึกษาขั้นสูง, พรินซ์ตันสืบค้นเมื่อ2022-11-04
- ↑ Wilkes, Maurice Vincent ; Wheeler, David John ; Gill, Stanley J. (1951). การเตรียมโปรแกรมสำหรับคอมพิวเตอร์ดิจิทัลอิเล็กทรอนิกส์ (ฉบับพิมพ์ซ้ำ 1982 ). สำนักพิมพ์ Tomash . ISBN 978-0-93822803-5. OCLC 313593586 .
{{cite book}}: ความไม่เข้ากันของหมายเลข ISBN / วันที่ ( ขอความช่วยเหลือ ) - ↑ Fairhead, Harry (16 พฤศจิกายน 2017). "ประวัติศาสตร์ของภาษาคอมพิวเตอร์ - ทศวรรษคลาสสิก ทศวรรษ 1950" . I Programmer . เก็บถาวรจากต้นฉบับเมื่อ 2 มกราคม 2020 . สืบค้นเมื่อ 6 มีนาคม 2020 .
- ↑ "ภาษาแอสเซมบลีขึ้นอยู่กับระบบปฏิบัติการอย่างไร?" Stack Exchange Stack Exchange Inc. 2011-07-28 . เก็บถาวรจากต้นฉบับเมื่อ 2020-03-24 . เรียกดูเมื่อ2020-03-24 .(หมายเหตุ: การเรียกใช้ระบบมักแตกต่างกันไป เช่น สำหรับMVSเทียบกับVSEเทียบกับ VM/CMS และรูปแบบไฟล์ไบนารี/ไฟล์ปฏิบัติการสำหรับระบบปฏิบัติการต่างๆ ก็อาจแตกต่างกันด้วย)
- ↑ Austerlitz, Howard ( 2003). "ภาษาโปรแกรมคอมพิวเตอร์" เทคนิคการได้มาซึ่งข้อมูลโดยใช้พีซี Elsevier หน้า326–360 doi : 10.1016/b978-012068377-2/ 50013-9 ISBN 9780120683772ภาษาแอสเซ ม
บลี (หรือแอสเซมเบลอร์) เป็นภาษาคอมพิวเตอร์ระดับต่ำที่ต้องคอมไพล์ มันขึ้นอยู่กับหน่วยประมวลผล เนื่องจากโดยพื้นฐานแล้วมันจะแปลงตัวย่อของแอสเซมเบลอร์โดยตรงไปเป็นคำสั่งที่ซีพียูตัวนั้นเข้าใจแบบหนึ่งต่อหนึ่ง ตัวย่อของแอสเซมเบลอร์เหล่านี้คือชุดคำสั่งสำหรับหน่วยประมวลผลนั้น
- ↑ Carnes, Beau (2022-04-27). "เรียนรู้การเขียนโปรแกรมภาษาแอสเซมบลีด้วย ARM" . freeCodeCamp.org . สืบค้นเมื่อ2022-06-21 .
ภาษาแอสเซมบลีมักจะเฉพาะเจาะจงกับสถาปัตยกรรมคอมพิวเตอร์แบบใดแบบหนึ่ง ดังนั้นจึงมีภาษาแอสเซมบลีหลายประเภท ARM เป็นภาษาแอสเซมบลีที่ได้รับความนิยมเพิ่มมากขึ้น
- ↑ Brooks, Frederick P. (1986). "ไม่มีทางออกที่ง่ายดาย—แก่นแท้และอุบัติเหตุในวิศวกรรมซอฟต์แวร์" รายงานการประชุม IFIP การประชุมคอมพิวเตอร์โลกครั้งที่ 10 หน้า1069–1076
- ↑ Anguiano, Ricardo. "linux kernel mainline 4.9 sloccount.txt" . Gist . สืบค้นเมื่อ2022-05-04 .
- ↑ "ภาษาแอสเซมบลีคืออะไร?" . GeeksforGeeks . 2023-10-19 . สืบค้นเมื่อ2026-04-24 .
- ↑ Daintith, John, บรรณาธิการ (2019). "meta-assembler" . พจนานุกรมวิทยาการคอมพิวเตอร์ . เก็บถาวรจากต้นฉบับเมื่อ 2020-03-24 . สืบค้นเมื่อ2020-03-24 .
- ↑ Xerox Data Systems (ตุลาคม 1975). คู่มืออ้างอิงภาษาและการทำงานของคอมพิวเตอร์ Xerox Meta-Symbol Sigma 5-9 (PDF)หน้าvi. เก็บถาวร(PDF)จากต้นฉบับเมื่อ 2022-10-09 เรียกดูเมื่อ 2020-06-07 ใช้
เป็นเมตาแอสเซมเบลอร์ ทำให้ผู้ใช้สามารถออกแบบภาษาโปรแกรมของตนเองและสร้างโปรเซสเซอร์สำหรับภาษาเหล่านั้นได้โดยใช้ความพยายามน้อยที่สุด
- ↑ Sperry Univac Computer Systems (1977). เอกสารอ้างอิงโปรแกรมเมอร์ Meta-Assembler (MASM) ของ Sperry Univac Computer Systems (PDF) . เก็บถาวร(PDF)จากต้นฉบับเมื่อ 2022-10-09 . เรียกดูเมื่อ2020-06-07 .
- ↑ "วิธีการใช้ภาษาแอสเซมบลีแบบอินไลน์ในโค้ดซี" . gnu.org . สืบค้นเมื่อ2020-11-05 .
- 1 2 3 4 Salomon, David (กุมภาพันธ์ 1993) [1992]. เขียนที่ California State University, Northridge, California, US. Chivers, Ian D. (บรรณาธิการ). Assemblers and Loaders (PDF) . Ellis Horwood Series In Computers And Their Applications (ฉบับที่ 1 ). Chicester, West Sussex, สหราชอาณาจักร: Ellis Horwood Limited / Simon & Schuster International Group . หน้า7, 237–238 . ISBN 0-13-052564-2. เก็บถาวร(PDF)จากต้นฉบับเมื่อ 2020-03-23 . เรียกดูเมื่อ2008-10-01 .(xiv+294+4 หน้า)
- ↑ Finlayson, Ian; Davis, Brandon; Gavin, Peter; Uh, Gang-Ryung; Whalley, David; Själander, Magnus; Tyson, Gary (2013). "การปรับปรุงประสิทธิภาพของโปรเซสเซอร์โดยการจัดลำดับคำสั่งแบบไปป์ไลน์แบบคงที่" Proceedings of the 14th ACM SIGPLAN/SIGBED conference on Languages, compilers and tools for embedded systems . pp. 33– 44. doi : 10.1145/2465554.2465559 . ISBN 9781450320856S2CID 8015812
- ↑ Beck, Leland L. (1996). "2". ซอฟต์แวร์ระบบ: บทนำสู่การเขียนโปรแกรมระบบ Addison Wesley .
- 1 2 Hyde, Randall (กันยายน 2003) [1996-09-30]. "คำนำ ("ทำไมใครๆ ถึงอยากเรียนเรื่องพวกนี้?") / บทที่ 12 – คลาสและออบเจ็กต์" ศิลปะแห่งภาษาแอสเซมบลี ( ฉบับที่ 2) สำนักพิมพ์ No Starch Press ISBN 1-886411-97-2เก็บถาวรจากต้นฉบับเมื่อ 2010-05-06 เรียกดูเมื่อ2020-06-22ข้อผิดพลาด:(928 หน้า)
- 1 2 3 4 คู่มือสำหรับนักพัฒนาซอฟต์แวร์สถาปัตยกรรม Intel เล่ม 2: เอกสารอ้างอิงชุดคำสั่ง (PDF)เล่ม2 บริษัท Intel 1999 เก็บถาวรจากต้นฉบับ(PDF)เมื่อ 11 มิถุนายน 2009 เรียกดูเมื่อ18 พฤศจิกายน 2010
- ↑ Ferrari, Adam; Batson, Alan; Lack, Mike; Jones, Anita (19 พฤศจิกายน 2018) [ฤดูใบไม้ผลิ 2006]. Evans, David (บรรณาธิการ). "คู่มือภาษาแอสเซมบลี x86" . วิทยาการคอมพิวเตอร์ CS216: การนำเสนอโปรแกรมและข้อมูล. มหาวิทยาลัยเวอร์จิเนีย . เก็บถาวรจากต้นฉบับเมื่อ 24 มีนาคม 2020. สืบค้นเมื่อ18 พฤศจิกายน 2010 .
- ↑ "คู่มือสถาปัตยกรรม SPARC ฉบับที่ 8" (PDF) . SPARC International . 1992. เก็บถาวรจากต้นฉบับ(PDF)เมื่อ 2011-12-10 . เรียกดูเมื่อ2011-12-10 .
- ↑ Moxham, James (1996). "ZINT Z80 Interpreter" . รหัสปฏิบัติการ Z80 สำหรับ ZINT . เก็บถาวรจากต้นฉบับเมื่อ 2020-03-24 . เรียกดูเมื่อ2013-07-21 .
- ↑ IEEE Std 694-1985: มาตรฐาน IEEE สำหรับภาษาแอสเซมบลีไมโครโปรเซสเซอร์สมาคมคอมพิวเตอร์ IEEE 1985 ISBN 0-7381-2752-3. OCLC 1415906564 .
- ↑ ไฮด์, แรนดัลล์ . "บทที่ 8. MASM: คำสั่งและรหัสเทียม" (PDF) . ศิลปะแห่งการเขียนโปรแกรมคอมพิวเตอร์ . เก็บถาวร(PDF)จากต้นฉบับเมื่อ 2020-03-24 . เรียกดูเมื่อ2011-03-19 .
- ↑ ระบบ Autocoder 1401, โปรแกรม #1401-AU-037, เวอร์ชัน 3, ระดับการแก้ไข 11 (PDF) . 7 ธันวาคม 1965 . สืบค้นเมื่อ21 มกราคม 2024 .
ข้อจำกัดหรือเงื่อนไขเล็กน้อยต่อไปนี้มีผลบังคับใช้เกี่ยวกับการใช้ Autocoder 1401 เมื่อเขียนโค้ดคำสั่งมาโคร ...
- ↑ Griswold, Ralph E. (1972). "บทที่ 1" การนำ SNOBOL4 ไปใช้ในระดับมหภาคซานฟรานซิสโก แคลิฟอร์เนีย สหรัฐอเมริกา: WH Freeman and Company ISBN 0-7167-0447-1.
- ↑ "Macros (C/C++), MSDN Library for Visual Studio 2008" . Microsoft Corp. 16 พฤศจิกายน 2012. เก็บถาวรจากต้นฉบับเมื่อ 24 มีนาคม 2020. เรียกดูเมื่อ22 มิถุนายน 2010 .
- ↑ Kessler, Marvin M. (1970-12-18). "*รายงานแนวคิด* ฉบับที่ 14 - การนำมาโครมาใช้เพื่ออนุญาตให้เขียนโปรแกรมแบบมีโครงสร้างใน OS/360" . ซอฟต์แวร์ MVS: มาโครแนวคิด 14 . เกเธอร์สเบิร์ก, แมริแลนด์, สหรัฐอเมริกา: บริษัท อินเตอร์เนชั่นแนล บิสซิเนส แมส คอร์ปอเรชั่น . เก็บถาวรจากต้นฉบับเมื่อ 2020-03-24 . สืบค้นเมื่อ2009-05-25 .
- ↑ "คุณสมบัติชุดเครื่องมือแอสเซมเบลอร์ระดับสูงช่วยเพิ่มประสิทธิภาพการทำงานของโปรแกรมเมอร์"จดหมายประกาศ IBM 12ธันวาคม 1995 A95-1432 เก็บถาวรจากต้นฉบับเมื่อ 7 มีนาคม 2023
- ↑ Whitesmiths Ltd (15 กรกฎาคม 1980). คู่มืออ้างอิงภาษาธรรมชาติ .
- ↑ "ภาษาแอสเซมบลี: คำจำกัดความและอื่นๆ อีกมากมายจาก Answers.com" . answers.com . เก็บถาวรจากต้นฉบับเมื่อ 2009-06-08 . เรียกดูเมื่อ2008-06-19 .
- ↑ Provinciano, Brian (17 เมษายน 2548). "NESHLA: โปรแกรมแอสเซมเบลอร์ระดับสูงแบบโอเพนซอร์ส 6502 สำหรับ Nintendo Entertainment System" . เก็บถาวรจากต้นฉบับเมื่อ 24 มีนาคม 2563 . เรียกดูเมื่อ24 มีนาคม 2563 .
- ↑ Dufresne, Steven (2018-08-21). "Kathleen Booth: การประกอบคอมพิวเตอร์ยุคแรกขณะคิดค้นภาษาแอสเซมบลี" . เก็บถาวรจากต้นฉบับเมื่อ 2020-03-24 . สืบค้นเมื่อ2019-02-10 .
- 1 2 Booth, Andrew Donald ; Britten, Kathleen Hylda Valerie (กันยายน 1947) [สิงหาคม 1947]. ข้อพิจารณาทั่วไปในการออกแบบคอมพิวเตอร์ดิจิทัลอิเล็กทรอนิกส์อเนกประสงค์ (PDF) (ฉบับที่ 2 ). สถาบันเพื่อการศึกษาขั้นสูง, พรินซ์ตัน, นิวเจอร์ซีย์, สหรัฐอเมริกา: วิทยาลัยเบิร์กเบ็ค, ลอนดอน . เก็บถาวร(PDF)จากต้นฉบับเมื่อ 2020-03-24 . สืบค้นเมื่อ2019-02-10 .
แนวคิดที่ไม่ใช่ต้นฉบับที่ปรากฏในข้อความต่อไปนี้ ได้มาจากแหล่งข้อมูลหลายแหล่ง ... อย่างไรก็ตาม รู้สึกว่าควรแสดงความขอบคุณต่อศาสตราจารย์ John von Neumann และดร. Herman Goldstein สำหรับการสนทนาที่เป็นประโยชน์มากมาย ...
- ↑ Campbell-Kelly, Martin (เมษายน 1982). "การพัฒนาการเขียนโปรแกรมคอมพิวเตอร์ในสหราชอาณาจักร (ค.ศ. 1945 ถึง 1955)". IEEE Annals of the History of Computing . 4 (2): 121– 139. doi : 10.1109/MAHC.1982.10016 . S2CID 14861159 .
- ↑ Campbell-Kelly, Martin (1980). "การเขียนโปรแกรม EDSAC: กิจกรรมการเขียนโปรแกรมในช่วงแรกที่มหาวิทยาลัยเคมบริดจ์" IEEE Annals of the History of Computing . 2 (1): 7– 36. doi : 10.1109/MAHC.1980.10009 .
- ↑ "รางวัลผู้บุกเบิกด้านคอมพิวเตอร์ประจำปี 1985 'สำหรับการเขียนโปรแกรมภาษาแอสเซมบลี' เดวิด วีลเลอร์" 27 มีนาคม 2018
- ↑ Wilkes, Maurice Vincent (1949). "EDSAC – เครื่องคำนวณอิเล็กทรอนิกส์". วารสารเครื่องมือวิทยาศาสตร์ . 26 (12): 385– 391. Bibcode : 1949JScI...26..385W . doi : 10.1088/0950-7671/26/12/301 .
- ↑ da Cruz, Frank (17 พฤษภาคม 2019). "เครื่องคิดเลขดรัมแม่เหล็ก IBM 650" . ประวัติศาสตร์การคำนวณ - ลำดับเหตุการณ์ของการคำนวณ. มหาวิทยาลัยโคลัมเบีย . เก็บถาวรจากต้นฉบับเมื่อ 15 กุมภาพันธ์ 2020. สืบค้นเมื่อ17 มกราคม 2012 .
- ↑ Abell, John C. "15 ตุลาคม 1956: Fortran เปลี่ยนแปลงโชคชะตาของการคำนวณไปตลอดกาล" . Wired . ISSN 1059-1028 . สืบค้นเมื่อ2 มีนาคม 2024 .
- ↑ Collen, Morris F. (มีนาคม–เมษายน 1994). "ต้นกำเนิดของสารสนเทศ"วารสารสมาคมสารสนเทศการแพทย์อเมริกัน 1 ( 2): 96– 97. doi : 10.1136/jamia.1994.95236152 . PMC 116189 . PMID 7719803 .
- ↑ "ประวัติย่อของเครื่องเล่นเกมย้อนยุคสำหรับโปรแกรมเมอร์" . pikuma.com . สืบค้นเมื่อ2026-04-16 .
- ↑ Pettus, Sam (10 มกราคม 2008). "SegaBase เล่ม 6 - Saturn" . เก็บถาวรจากต้นฉบับเมื่อ 13 กรกฎาคม 2008 . เรียกดูเมื่อ25 กรกฎาคม 2008 .
- ↑ Kauler, Barry (9 มกราคม 1997). ภาษาแอสเซมบลีของ Windows และการเขียนโปรแกรมระบบ: การเขียนโปรแกรมระดับต่ำ 16 บิตและ 32 บิตสำหรับพีซีและ Windowsสำนักพิมพ์CRC ISBN 978-1-48227572-8สืบค้นเมื่อ 2020-03-24 การ
ถกเถียงเกี่ยวกับความเหมาะสมของภาษาแอสเซมบลีในโลกการเขียนโปรแกรมสมัยใหม่ของเรายังคงดำเนินต่อไป
- ↑ Hsieh, Paul (2020-03-24) [2016, 1996]. "การเพิ่มประสิทธิภาพการเขียนโปรแกรม" . เก็บถาวรจากต้นฉบับเมื่อ 2020-03-24 . สืบค้นเมื่อ2020-03-24 .
... การเปลี่ยนแปลงการออกแบบมักส่งผลต่อประสิทธิภาพมากกว่า ... ไม่ควรข้ามไปใช้ภาษาแอสเซมบลีโดยตรงจนกว่า ...
- ↑ "ดัชนี TIOBE" . ซอฟต์แวร์ TIOBE . เก็บถาวรจากต้นฉบับเมื่อ 2020-03-24 . เรียกดูเมื่อ2020-03-24 .
- ↑ Rusling, David A. (1999) [1996]. "บทที่ 2 พื้นฐานซอฟต์แวร์" . เคอร์เนลลินุกซ์ . เก็บถาวรจากต้นฉบับเมื่อ 2020-03-24 . สืบค้นเมื่อ2012-03-11 .
- 1 2 Markoff, John Gregory (2005-11-28). "การเขียนโค้ดที่เร็วที่สุดด้วยมือเพื่อความสนุก: คอมพิวเตอร์มนุษย์เร่งความเร็วชิปอย่างต่อเนื่อง"เดอะนิวยอร์กไทมส์ซีแอตเติล วอชิงตัน สหรัฐอเมริกาเก็บถาวรจากต้นฉบับเมื่อ 2020-03-23 สืบค้นเมื่อ2010-03-04
- ↑ "Bit-field-badness" . hardwarebug.org . 30 มกราคม 2010. เก็บถาวรจากต้นฉบับเมื่อ 5 กุมภาพันธ์ 2010. เรียกดูเมื่อ4 มีนาคม 2010 .
- ↑ "GCC สร้างความยุ่งเหยิง" . hardwarebug.org . 2009-05-13. เก็บถาวรจากต้นฉบับเมื่อ 2010-03-16 . เรียกดูเมื่อ2010-03-04 .
- ↑ ไฮด์, แรนดัล . "การถกเถียงครั้งยิ่งใหญ่" . เก็บถาวรจากต้นฉบับเมื่อ 2008-06-16 . เรียกดูเมื่อ2008-07-03 .
- ↑ "การเขียนโค้ดล้มเหลวอีกครั้ง" hardwarebug.org 30มกราคม 2010 เก็บถาวรจากต้นฉบับเมื่อ 2 เมษายน 2010 เรียกดูเมื่อ 4 มีนาคม2010
- ↑ Click, Cliff ; Goetz, Brian. "A Crash Course in Modern Hardware" . เก็บถาวรจากต้นฉบับเมื่อ 2020-03-24 . เรียกดูเมื่อ2014-05-01 .
- ↑ "การเขียนโปรแกรม 68K ใน Fargo II" . เก็บถาวรจากต้นฉบับเมื่อ 2 กรกฎาคม 2551 . เรียกดูเมื่อ3 กรกฎาคม 2551 .
- ↑ "BLAS Benchmark-August2008" . eigen.tuxfamily.org. 2008-08-01. เก็บถาวรจากต้นฉบับเมื่อ 2020-03-24 . เรียกดูเมื่อ2010-03-04 .
- ↑ "x264.git/common/x86/dct-32.asm" . git.videolan.org. 2010-09-29. เก็บถาวรจากต้นฉบับเมื่อ 2012-03-04 . เรียกดูเมื่อ2010-09-29 .
- ↑ "rav1e/README.md ที่ v0.6.3" . GitHub . เก็บถาวรจากต้นฉบับเมื่อ 2023-02-22 . เรียกดูเมื่อ2023-02-21 .
- ↑ "README.md · 1.1.0 · VideoLAN / dav1d" . 2023-02-13. เก็บถาวรจากต้นฉบับเมื่อ 2023-02-22 . เรียกดูเมื่อ2023-02-21 .
- ↑ Bosworth, Edward (2016). "บทที่ 1 – เหตุใดจึงต้องศึกษาภาษาแอสเซมบลี" . www.edwardbosworth.com . เก็บถาวรจากต้นฉบับเมื่อ 2020-03-24 . สืบค้นเมื่อ2016-06-01 .
- ↑ "คำสั่งมาโคร DFSMS สำหรับชุดข้อมูล z/OS เวอร์ชัน 2 รุ่น 3" (PDF) IBM. 15 กุมภาพันธ์ 2019. เก็บถาวร(PDF)จากต้นฉบับเมื่อ 25 มิถุนายน 2021. เรียกดูเมื่อ14 กันยายน 2021 .
- ↑ Paul, Matthias R. (2001) [1996], "เอกสารข้อมูลจำเพาะและเอกสารอ้างอิงสำหรับ NECPINW" , NECPINW.CPI - ไดรเวอร์สลับหน้าโค้ด DOS สำหรับNEC Pinwriters ( รุ่นที่ 2.08), FILESPEC.TXT, NECPINW.ASM, EUROFONT.INC จาก NECPI208.ZIP, เก็บถาวรจากต้นฉบับเมื่อ 2017-09-10 , เรียกดูเมื่อ 2013-04-22
- ↑Paul, Matthias R. (2002-05-13). "[fd-dev] mkeyb". freedos-dev. Retrieved 2018-09-10.
{{cite web}}: CS1 maint: deprecated archival service (link)
Further reading
- Bartlett, Jonathan (2004). Programming from the Ground Up - An introduction to programming using linux assembly language. Bartlett Publishing. ISBN 0-9752838-4-7. Archived from the original on 2020-03-24. Retrieved 2020-03-24.
- Britton, Robert (2003). MIPS Assembly Language Programming. Prentice Hall. ISBN 0-13-142044-5.
- Calingaert, Peter (1979) [1978-11-05]. Written at University of North Carolina at Chapel Hill. Horowitz, Ellis (ed.). Assemblers, Compilers, and Program Translation. Computer software engineering series (1st printing, 1st ed.). Potomac, Maryland, US: Computer Science Press, Inc.ISBN 0-914894-23-4. ISSN 0888-2088. LCCN 78-21905. Retrieved 2020-03-20. (2+xiv+270+6 pages)
- Duntemann, Jeff (2000). Assembly Language Step-by-Step. Wiley. ISBN 0-471-37523-3.
- Hyde, Randall (2010). The Art of Assembly Language (2nd ed.). No Starch Press. ISBN 978-1593272074.
- Jorgensen, Ed. "x86-64 Assembly Language Programming with Ubuntu"(PDF).
- Kann, Charles W. (2015). "Introduction to MIPS Assembly Language Programming". Archived from the original on 2020-03-24. Retrieved 2020-03-24.
- Kann, Charles W. (2021). "Introduction to Assembly Language Programming: From Soup to Nuts: ARM Edition". Open Educational Resources.
- Norton, Peter; Socha, John (1986). Peter Norton's Assembly Language Book for the IBM PC. New York, US: Brady Books.
- Singer, Michael (1980). PDP-11. Assembler Language Programming and Machine Organization. New York, US: John Wiley & Sons.
- Sweetman, Dominic (1999). See MIPS Run. Morgan Kaufmann Publishers. ISBN 1-55860-410-3.
- Waldron, John (1998). Introduction to RISC Assembly Language Programming. Addison Wesley. ISBN 0-201-39828-1.
- "ASM Community Book" . 2009. เก็บถาวรจากต้นฉบับเมื่อ 2013-05-30 . เรียกดูเมื่อ2013-05-30 .("หนังสือออนไลน์ที่เต็มไปด้วยข้อมูลที่เป็นประโยชน์เกี่ยวกับ ASM บทช่วยสอน และตัวอย่างโค้ด" โดยชุมชน ASM ซึ่งจัดเก็บไว้ในคลังเก็บข้อมูลอินเทอร์เน็ต)
ลิงก์ภายนอก
- หน้าเว็บเกี่ยว กับภาษาแอสเซมบลีและการเรียนรู้ภาษาแอสเซมบลีบนWikiWikiWeb
- ตัวอย่างการเขียนโปรแกรมภาษาแอสเซมบลี
- บทนำเกี่ยวกับภาษาแอสเซมบลี Windows x64