넷와이드 어셈블러

Netwide Assembler
넷와이드 어셈블러
NASM logo
원저작자사이먼 태텀, 줄리안 홀
개발자H. 피터 애빈
초기 릴리즈1996년 10월, 25년 전(1996-10년)
안정된 릴리스
2.15.05[1] / 2020년 8월 28일; 23개월 전 (2020년 8월 28일)
저장소
기입처조립체[2], C
운영 체제Unix 대응, Windows, OS/2, MS-DOS
이용가능기간:영어
유형x86 어셈블러
면허증.BSD 2절
웹 사이트www.nasm.us

Netwide Assembler (NASM)는 인텔 x86 아키텍처용 어셈블러디스어셈블러입니다.16비트, 32비트(IA-32) 및 64비트(x86-64) 프로그램을 쓰는 데 사용할 수 있습니다.Linux에서 [3]가장 인기 있는 어셈블러 중 하나로 여겨지고 있습니다.

그것은 원래 Simon Tatham이 Julian Hall의 도움을 받아 썼다.2016년 현재, 그것은 H. Peter [4]Anvin이 이끄는 작은 팀에 의해 유지되고 있다.이것은 간단한 (2절) BSD 라이선스의 [5]조건에 따라 출시된 오픈 소스 소프트웨어입니다.

특징들

NASM은 COFF, OMF, a.out, Executable and Linkable Format(ELF), Mach-O 바이너리 파일(.bin, 운영체제 컴파일에 사용되는 바이너리 디스크 이미지)을 포함한 여러 바이너리 포맷을 출력할 수 있습니다.단, 위치 독립 코드는 ELF 오브젝트 파일에서만 지원됩니다.또한 [6]RDOFF라고 불리는 자체 바이너리 형식을 가지고 있습니다.

다양한 출력 포맷을 통해 거의 모든 x86 운영체제(OS)로 프로그램 대상을 변경할 수 있습니다.또, 부트 로더, 읽기 전용 메모리(ROM) 이미지, [6]OS 개발의 다양한 측면에 쓸 수 있는 플랫 바이너리 파일도 작성할 수 있습니다.PowerPCSPARC와 같은 x86 이외의 플랫폼에서는 크로스 어셈블러로서 실행할 수 있지만 이러한 머신에서 사용할 수 있는 프로그램을 생성할 수는 없습니다.

NASM은 AT&T [7]구문 대신 인텔 어셈블리 구문을 사용합니다.또한 MASM 및 호환 [6]어셈블러에 의해 사용되는 세그먼트오버라이드 자동 생성(및 관련된 AUSM 디렉티브) 등의 기능도 회피합니다.

샘플 프로그램

DOS 운영체제용 "Hello, world!" 프로그램:

부분.본문 조직0x100  움직이다 아., 0x9  움직이다 dx, 안녕  인트 0x21   움직이다 도끼, 0x4c00  인트 0x21  부분.데이터. 안녕하세요. db 안녕, 세상아!, 13, 10, '
                

Linux용 동등한 프로그램:

세계적인_스타트  부분.본문 _시작:  움직이다 이액스, 4 쓰다  움직이다 ebx, 1 ; stdout  움직이다 ecx, 메시지  움직이다 엣지, msg.len  인트 0x80   ; write(stdout, msg, strlen(msg);   xor 이액스, msg.len ; return 값을 write()에서 반전합니다.  xchg 이액스, ebx ; exit() 값  움직이다 이액스, 1 ; 종료  인트 0x80   ; exit(...)  부분.데이터. 메시지: db "안녕, 세상아!", 10 .len: 등가 $ - 메시지 

Microsoft Windows 용 유사한 프로그램의 예:

세계적인메인 외부_MessageBoxA@16 외부_Exit Process@4  부분코드 사용32 cl멍청이=코드 메인:  밀다 워드 0      ; UINT uType = MB_OK  밀다 워드 직함  ; LPCTR lpCaption  밀다 워드 배너 ; LPCTR lpText  밀다 워드 0      ; HWND hWnd = NULL  불러 _MessageBoxA@16   밀다 워드 0      ; UINT uExit Code  불러 _Exit Process@4  부분데이터. 사용32 cl멍청이=데이터.  배너: db 안녕, 세상아!, 0  제목: db '안녕하세요', 0 

키 스트로크를 입력하여 화면에 표시하는 Apple OS X용 64비트 프로그램:

세계적인_스타트  부분.데이터.   query_string:  db "문자 입력: "  query_string_len: 등가 $ - query_string  out_string:   db "입력할 수 있습니다."  out_string_len:  등가 $ - 출력_문자열  부분.bss   in_char:   재스왑 4  부분.본문  _시작:   움직이다 락스, 0x2000004   ; write-system-call-code를 레지스터 rax에 넣습니다.  움직이다 rdi, 1    ; 커널에게 stdout을 사용하도록 지시합니다.  움직이다 RSI, query_string ; rsi는 커널이 메시지의 주소를 찾을 것으로 예상되는 위치입니다.  움직이다 rdx, query_string_len ; 및 rdx는 커널이 메시지의 길이를 찾을 것으로 예상되는 위치입니다.  시스템   ; 글자를 읽다  움직이다 락스, 0x2000003  ; 시스템 호출을 읽다  움직이다 rdi, 0    ; stdin  움직이다 RSI, 입력_char  ; 스토리지 주소, 섹션 .bss에 선언되어 있습니다.  움직이다 rdx, 2    커널의 버퍼에서2 바이트를 가져옵니다(캐리지 리턴용으로1 바이트).  시스템   ; 사용자에게 출력을 표시합니다.  움직이다 락스, 0x2000004  ; 시스템 호출을 기입  움직이다 rdi, 1    ; stdout  움직이다 RSI, 출력_문자열  움직이다 rdx, out_string_len  시스템   움직이다 락스, 0x2000004  ; 시스템 호출을 기입  움직이다 rdi, 1    ; stdout  움직이다 RSI, 입력_char  움직이다 rdx, 2    ; 두 번째 바이트는 문자열에서 예상되는 캐리지 리턴을 적용하는 것입니다.  시스템   ; 시스템 호출을 종료합니다.  움직이다 락스, 0x2000001  ; 시스템 호출을 종료합니다.  xor     rdi, rdi  시스템 

링크

NASM은 주로 객체파일을 출력합니다.일반적으로 객체파일은 그 자체로는 실행할 수 없습니다.유일한 예외는 플랫 바이너리(예: .COM)[6]입니다.이 바이너리들은 현대 사용법에 본질적으로 제한되어 있습니다.오브젝트 파일을 실행 가능한 프로그램으로 변환하려면 적절한 링커를 사용해야 합니다.예를 들어 Windows용 Visual Studio "LINK" 유틸리티, Unix용 시스템용 ld 등입니다.

발전

NASM 버전 0.90은 1996년 [5]10월에 출시되었습니다.

버전 2.00은 2007년 11월 28일에 출시되었으며 x86-64 [4]확장 지원이 추가되었습니다.개발 버전은 SourceForge.net에 업로드되지 않고 프로젝트 웹 페이지에서 사용할 수 있는 바이너리 스냅샷으로 GitHub에 체크인됩니다.

NASM 문서의 검색 엔진도 사용할 [8]수 있습니다.

2009년 7월 버전 2.07에서 NASM은 Simplified (2절) BSD 라이선스로 출시되었습니다.이전에는 LGPL로 라이선스되었기 때문에 New BSD License로 완전히 고쳐 쓴 Yasm의 개발로 이어졌습니다.Yasm은 NASM보다 먼저 x86-64를 지원했습니다.또한 GNU Assembler 구문에 대한 지원도 추가되었습니다.

RDOFF

개발자는 RDOFF(Regocatable Dynamic Object File Format)를 사용하여 NASM의 객체 파일 출력 기능의 무결성을 테스트합니다.기본적으로 출력 드라이버 함수 호출의 시리얼화를 포함하는 헤더와 실행 가능한 코드 또는 데이터를 포함하는 섹션 배열로 구성됩니다.[9]NASM 배포에는 링커 및 로더 등의 형식을 사용하기 위한 도구가 포함되어 있습니다.

1996년 10월에 버전 0.90이 출시될 때까지 NASM은 플랫 포맷 실행 파일(DOS COM 파일 )의 출력만 지원했습니다.버전 0.90에서 Simon Tatham은 오브젝트 파일 출력 인터페이스 및 DOS 지원을 추가하였습니다.16비트 코드용 OBJ 파일만.[10]

따라서 NASM에는 32비트 객체 형식이 없었습니다.이러한 부족함을 해결하고 객체 파일 인터페이스를 학습하기 위한 연습으로 개발자인 Julian Hall은 NASM 버전 0.[10]91로 출시된 RDOFF의 첫 번째 버전을 만들었습니다.

이 초기 버전 이후 RDOFF 포맷은 크게 갱신되었습니다.이것에 의해, 각 헤더 [11]레코드에 레코드 길이 인디케이터가 추가되어 프로그램이 인식하지 않는 포맷의 레코드는 건너뛰고, 복수의 세그먼트를 서포트할 수 있게 되었습니다.RDOFF1은 텍스트, 데이터, 및 bss(초기화되지 않은 데이터를 포함한)[9]의 3개의 세그먼트만을 서포트하고 있습니다.

RDOFF 형식은 강력히 권장되지 않으며 NASM 2.15.[12]04부터 비활성화되어 있습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "Release 2.15.05". 28 August 2020. Retrieved 6 September 2020.
  2. ^ "NASM, the Netwide Assembler". GitHub. 25 October 2021.
  3. ^ Ram Narayan. "Linux assemblers: A comparison of GAS and NASM". Archived from the original on 3 October 2013. two of the most popular assemblers for Linux, GNU Assembler (GAS) and Netwide Assembler (NASM)
  4. ^ a b "The Netwide Assembler". Retrieved 27 June 2008.
  5. ^ a b "NASM Version History". Retrieved 3 August 2019.
  6. ^ a b c d "NASM Manual". Archived from the original on 23 February 2009. Retrieved 15 August 2009.
  7. ^ Randall Hyde. "NASM: The Netwide Assembler". Archived from the original on 12 September 2010. Retrieved 27 June 2008.
  8. ^ "NASM Doc Search Engine". Archived from the original on 23 January 2010. Retrieved 14 September 2009.
  9. ^ a b "NASM Manual Ch. 6". Retrieved 27 June 2008.
  10. ^ a b "NASM CVS". 8 June 2008. Retrieved 27 June 2008.
  11. ^ "V1-V2.txt". 4 December 2002. Retrieved 27 June 2008.
  12. ^ "Relocatable Dynamic Object File Format (deprecated)".

추가 정보

외부 링크