ผู้ประกอบเครือข่าย

นาสเอ็ม
ผู้เขียนต้นฉบับไซมอน เทแธม , จูเลียน ฮอลล์
นักพัฒนาเอช. ปีเตอร์ อันวิน , ชาง ซอก เบ, จิม คูคูนัส, แฟรงค์ บี. คอตเลอร์, ไซริล กอร์คูนอฟ
การเปิดตัวครั้งแรกตุลาคม 2539 ; 27 ปีที่แล้ว (1996-10)
การปล่อยที่มั่นคง
2.16.01 [1]  / 21 ธันวาคม 2565 ; 14 เดือนที่แล้ว (21 December 2022)
พื้นที่เก็บข้อมูล
  • github.com/netwide-assembler/nasm
เขียนในงานประกอบ , ซี[2]
ระบบปฏิบัติการระบบปฏิบัติการแบบ Unix , Windows , OS/2 , MS-DOS
มีจำหน่ายในภาษาอังกฤษ
พิมพ์ ตัวประกอบx86
ใบอนุญาตBSD 2 ข้อ
เว็บไซต์www.nasm.us

Netwide Assembler ( NASM ) เป็นตัวประกอบและตัวแยกชิ้นส่วนสำหรับสถาปัตยกรรมIntel x86 สามารถใช้เขียน โปรแกรม 16 บิต , 32 บิต ( IA-32 ) และ64 บิต ( x86-64 ) ถือเป็นหนึ่งในแอสเซมเบลอร์ที่ได้รับความนิยมมากที่สุดสำหรับชิปLinuxและx86 [3]

เดิมเขียนโดยSimon Tathamโดยได้รับความช่วยเหลือจาก Julian Hall ในปี 2016 มีการดูแลโดยทีมงานเล็กๆ ที่นำโดยH. Peter Anvin [4]เป็นซอฟต์แวร์โอเพ่นซอร์สที่เผยแพร่ภายใต้เงื่อนไขของใบอนุญาต BSD แบบง่าย (2 ข้อ) [5]

คุณสมบัติ

NASM สามารถส่งออกรูปแบบไบนารี่ได้หลายรูปแบบ รวมถึงCOFF , OMF, a.out , Executable and Linkable Format (ELF), Mach-Oและไฟล์ไบนารี่ (.bin, binary disk image ใช้ในการคอมไพล์ระบบปฏิบัติการ ) แม้ว่าโค้ดจะไม่ขึ้นกับตำแหน่ง ก็ตาม รองรับเฉพาะไฟล์อ็อบเจ็กต์ ELF เท่านั้น นอกจากนี้ยังมีรูปแบบไบนารีของตัวเองที่เรียกว่า RDOFF [6]

รูปแบบเอาต์พุตที่หลากหลายทำให้สามารถ กำหนดเป้าหมายโปรแกรม ใหม่ไปยังระบบปฏิบัติการ x86 (OS) ใดๆ ก็ได้ นอกจากนี้ยังสามารถสร้างไฟล์ไบนารีแบบแบนใช้สำหรับเขียนบูตโหลดเดอร์ อิมเมจหน่วย ความจำแบบอ่านอย่างเดียว (ROM) และในแง่มุมต่างๆ ของการพัฒนาระบบปฏิบัติการ [6]มันสามารถทำงานบนแพลตฟอร์มที่ไม่ใช่ x86 ในรูปแบบcross assemblerเช่นPowerPCและSPARCแม้ว่าจะไม่สามารถสร้างโปรแกรมที่เครื่องเหล่านั้นใช้งานได้ก็ตาม

NASM ใช้รูปแบบไวยากรณ์แอสเซมบลีของIntel แทนไวยากรณ์AT&T [7]นอกจากนี้ยังหลีกเลี่ยงคุณลักษณะต่างๆ เช่น การสร้าง การแทนที่ เซ็กเมนต์ โดยอัตโนมัติ (และคำสั่ง ASSUME ที่เกี่ยวข้อง) ที่ใช้โดยMASMและแอสเซมเบลอร์ที่เข้ากันได้ [6]

โปรแกรมตัวอย่าง

“ สวัสดีชาวโลก!” โปรแกรมสำหรับ ระบบปฏิบัติการ DOS :

ส่วน. text org 0x100 mov ah , 0x9 mov dx สวัสดีint 0x21 
 
		 
		 
		

	mov ขวาน, 0x4c00 int 0x21	 
		

ส่วน.data สวัสดี: db 'สวัสดีชาวโลก!' , 13 , 10 , '$' 
	    

โปรแกรมที่เทียบเท่าสำหรับLinux :

ทั่วโลก_start 

ส่วน.text _start: mov eax , 4 ; เขียนmov ebx , 1 ; stdout mov ecx , msg mov edx , msg.len int 0x80 ; เขียน (stdout, msg, strlen (msg)); 

		  
		  
		 
		 
		   

	xor eax , msg.len ; กลับค่าที่ส่งคืนจาก write() xchg eax , ebx ; ค่าสำหรับการออก () mov eax , 1 ; ออกint 0x80 ; ออก(...)	  
	   
		  
		   

ส่วน.data msg: db "สวัสดีชาวโลก!" , 10 .len: equ $ - ผงชูรส 
		 
		  

ตัวอย่างของโปรแกรมที่คล้ายกันสำหรับMicrosoft Windows :

global _main ภายนอก_MessageBoxA@16 ภายนอก_ExitProcess@4 
 
 

รหัสส่วนuse32 class = รหัส_main: กดdword 0 ; UINT uType = MB_OK ดันชื่อdword ; LPCSTR lpCaption ดันแบนเนอร์dword ; LPCSTR lpText กดdword 0 ; HWND hWnd = โทร NULL _MessageBoxA@16   

		       
		   
		  
		       
		

	กดdword 0 ; UINT uExitCode โทร_ExitProcess@4	       
		

ข้อมูลส่วนuse32 class = แบนเนอร์ ข้อมูล: db 'สวัสดีชาวโลก!' , 0 ชื่อ: db 'สวัสดี' , 0   
		  
		  

โปรแกรม 64 บิตสำหรับ Apple OS Xที่ป้อนข้อมูลการกดแป้นพิมพ์และแสดงบนหน้าจอ:

ทั่วโลก_start 

ส่วน.data 

	query_string: db "ป้อนอักขระ: " query_string_len: equ $ - query_string out_string: db "คุณมีอินพุต: " out_string_len: equ $ - out_string			
			  
					
				  

ส่วน.bss 

	in_char: รีเวิร์ส4			 

ส่วน.ข้อความ 

_เริ่ม:

	mov rax , 0x2000004 ; ใส่รหัสการเขียนระบบการโทรลงในการลงทะเบียน rax mov rdi , 1 ; บอกเคอร์เนลให้ใช้ stdout mov rsi , query_string ; rsi เป็นที่ที่เคอร์เนลคาดว่าจะค้นหาที่อยู่ของข้อความmov rdx , query_string_len ; และ rdx คือตำแหน่งที่เคอร์เนลคาดว่าจะค้นหาความยาวของข้อความsyscall	 	 	
		 				
		 	
		 	
	

	; อ่านด้วยตัวอักษร
mov rax , 0x2000003 ; อ่านระบบเรียกmov rdi , 0 ; stdin mov rsi , in_char ; ที่อยู่สำหรับการจัดเก็บประกาศในส่วน .bss mov rdx , 2 ; รับ 2 ไบต์จากบัฟเฟอร์ของเคอร์เนล (หนึ่งไบต์สำหรับการส่งคืนรถ) syscall		 		
		 				
		 		
		 				
	

	; แสดงให้ผู้ใช้เห็นเอาต์พุต
mov rax , 0x2000004 ; เขียนระบบเรียกmov rdi , 1 ; stdout mov rsi , out_string mov rdx , out_string_len syscall		 		
		 				
		 
		 
	

	mov rax , 0x2000004 ; เขียนระบบเรียกmov rdi , 1 ; stdout mov rsi , in_char mov rdx , 2 ; ไบต์ที่สองคือการใช้การคืนแคร่ที่คาดหวังในสตริงsyscall	 		
		 				
		 
		 				
	

	; ออกจากระบบ เรียก
mov rax , 0x2000001 ; ออกจากระบบเรียกxor rdi , rdi syscall		 		
	      
	

การเชื่อมโยง

NASM ส่งออกไฟล์อ็อบเจ็กต์ เป็นหลัก ซึ่งโดยทั่วไปไม่สามารถเรียกใช้งานได้ด้วยตัวเอง ข้อยกเว้นประการเดียวคือไบนารีแบบแบน (เช่น.COM ) [6]ซึ่งถูกจำกัดในการใช้งานสมัยใหม่ ในการแปลไฟล์อ็อบเจ็กต์เป็นโปรแกรมที่ปฏิบัติการ ได้ ต้องใช้ ตัวเชื่อมโยง ที่เหมาะสม เช่น ยูทิลิตี Visual Studio "LINK" สำหรับ Windows หรือldสำหรับระบบที่คล้าย Unix

การพัฒนา

NASM เวอร์ชัน 0.90 เปิดตัวในเดือนตุลาคม พ.ศ. 2539 [5]

เวอร์ชัน 2.00 เปิดตัวเมื่อวันที่ 28 พฤศจิกายน พ.ศ. 2550 โดยเพิ่มการรองรับส่วนขยายx86-64 [4]เวอร์ชันการพัฒนาไม่ได้อัปโหลดไปยังSourceForge.netแต่จะถูกตรวจสอบในGitHubด้วยสแน็ปช็อตไบนารี่จากหน้าเว็บของโครงการ

นอกจากนี้ยังมีเครื่องมือค้นหาสำหรับเอกสารของ NASM อีกด้วย [8]

ในเดือนกรกฎาคม พ.ศ. 2552 ในเวอร์ชัน 2.07 NASM ได้รับการเผยแพร่ภายใต้ใบอนุญาต BSD แบบง่าย (2 ข้อ) ก่อนหน้านี้ เนื่องจากได้รับอนุญาตภายใต้LGPLจึงนำไปสู่การพัฒนา Yasm ซึ่งเป็นการเขียนใหม่ทั้งหมดภายใต้ใบอนุญาต BSDใหม่ Yasm ให้การสนับสนุน x86-64 ก่อนหน้า NASM นอกจากนี้ยังเพิ่มการรองรับไวยากรณ์ GNU Assembler

อาร์ดอฟ

นักพัฒนาใช้รูปแบบไฟล์อ็อบเจ็กต์แบบไดนามิกที่ย้ายตำแหน่งได้ (RDOFF) เพื่อทดสอบความสมบูรณ์ของความสามารถในการส่งออกไฟล์อ็อบเจ็กต์ของ NASM มีพื้นฐานอยู่บนโครงสร้างภายในของ NASM เป็นอย่างมาก[9]โดยพื้นฐานแล้วประกอบด้วยส่วนหัวที่มีการซีเรียลไลซ์ของการเรียกฟังก์ชันไดรเวอร์เอาท์พุต ตามด้วยอาร์เรย์ของส่วนต่างๆ ที่มีโค้ดหรือข้อมูลที่สามารถเรียกใช้งานได้ เครื่องมือสำหรับการใช้รูปแบบ รวมถึงตัวเชื่อมโยงและตัวโหลด จะรวมอยู่ในการกระจายของ NASM

จนกระทั่งเวอร์ชัน 0.90 เปิดตัวในเดือนตุลาคม พ.ศ. 2539 NASM รองรับเอาต์พุตของไฟล์ปฏิบัติการรูปแบบแบนเท่านั้น (เช่น ไฟล์ DOS COM ) ในเวอร์ชัน 0.90 Simon Tathamได้เพิ่มการรองรับอินเทอร์เฟซเอาต์พุตอ็อบเจ็กต์ไฟล์ และสำหรับไฟล์ DOS .OBJ สำหรับโค้ด 16 บิตเท่านั้น [10]

NASM จึงขาดรูปแบบอ็อบเจ็กต์ 32 บิต เพื่อแก้ไขข้อบกพร่องนี้ และเพื่อเป็นแบบฝึกหัดในการเรียนรู้อินเทอร์เฟซอ็อบเจ็กต์ไฟล์ นักพัฒนา Julian Hall ได้รวบรวมเวอร์ชันแรกของ RDOFF ซึ่งเผยแพร่ใน NASM เวอร์ชัน 0.91 [10]

ตั้งแต่เวอร์ชันเริ่มต้นนี้ มีการอัปเดตที่สำคัญครั้งหนึ่งในรูปแบบ RDOFF ซึ่งเพิ่มตัวบ่งชี้ความยาวบันทึกในแต่ละเร็กคอร์ดส่วนหัว[11]อนุญาตให้โปรแกรมข้ามบันทึกที่มีรูปแบบที่พวกเขาไม่รู้จัก และรองรับหลายส่วน RDOFF1 รองรับสามส่วนเท่านั้น: text , dataและbss (ประกอบด้วยข้อมูลที่ยังไม่ได้เตรียมใช้งาน) [9]

รูปแบบ RDOFF เลิกใช้แล้วอย่างยิ่งและถูกปิดใช้งานตั้งแต่ NASM 2.15.04 เป็นต้นไป [12]

ดูสิ่งนี้ด้วย

อ้างอิง

  1. "ดัชนีของ /pub/nasm/releasebuilds/2.16.01"
  2. "NASM, ผู้ประกอบเครือข่ายเน็ตไวด์". GitHub . 25 ตุลาคม 2021.
  3. รามนารายณ์. "แอสเซมเบลอร์ Linux: การเปรียบเทียบ GAS และ NASM" ไอบีเอ็ม . เก็บถาวรจากต้นฉบับเมื่อวันที่ 3 ตุลาคม 2013 สองแอสเซมเบลอร์ที่ได้รับความนิยมมากที่สุดสำหรับ Linux, GNU Assembler (GAS) และ Netwide Assembler (NASM)
  4. ↑ ab "ผู้ประกอบ Netwide " สืบค้นเมื่อ27 มิถุนายน 2551 .
  5. ↑ ab "ประวัติเวอร์ชันของ NASM " สืบค้นเมื่อ3 สิงหาคม 2019 .
  6. ↑ abcd "คู่มือ NASM" เก็บถาวรจากต้นฉบับเมื่อ 23 กุมภาพันธ์ 2552 . สืบค้นเมื่อ15 สิงหาคม 2552 .
  7. แรนดัลล์ ไฮด์ . "NASM: ผู้ประกอบเครือข่าย" เก็บถาวรจากต้นฉบับเมื่อ 12 กันยายน 2010 . สืบค้นเมื่อ27 มิถุนายน 2551 .
  8. "เครื่องมือค้นหาเอกสาร NASM". เก็บถาวรจากต้นฉบับเมื่อ 23 มกราคม 2010 . สืบค้นเมื่อ14 กันยายน 2552 .
  9. ↑ ab "คู่มือ NASM Ch. 6" . สืบค้นเมื่อ27 มิถุนายน 2551 .
  10. ↑ ab "NASM CVS". 8 มิถุนายน 2551 . สืบค้นเมื่อ27 มิถุนายน 2551 .
  11. "V1-V2.txt" 4 ธันวาคม 2545 . สืบค้นเมื่อ27 มิถุนายน 2551 .
  12. "รูปแบบไฟล์วัตถุไดนามิกที่ย้ายตำแหน่งได้ (เลิกใช้แล้ว)"

อ่านเพิ่มเติม

ลิงค์ภายนอก

  • เว็บไซต์อย่างเป็นทางการ
  • แอสเซมเบลอร์ Netwide บนSourceForge
  • รุ่นพิเศษสำหรับ Win32 และ BeOS
  • การเปรียบเทียบ GAS และ NASM ที่IBM
  • "ผู้ประกอบเครือข่าย" รหัสฟรี .: ตัวแปลงระหว่างรูปแบบต้นฉบับของแอสเซมเบลอร์ NASM และGAS
Retrieved from "https://en.wikipedia.org/w/index.php?title=Netwide_Assembler&oldid=1208502058"