어셈블리-기본 구문

조립 프로그램은 세 부분으로 나눌 수 있습니다.

  • 그만큼 data 부분,

  • 그만큼 bss 섹션 및

  • 그만큼 text 부분.

데이터 섹션

그만큼 data섹션은 초기화 된 데이터 또는 상수를 선언하는 데 사용됩니다. 이 데이터는 런타임에 변경되지 않습니다. 이 섹션에서는 다양한 상수 값, 파일 이름 또는 버퍼 크기 등을 선언 할 수 있습니다.

데이터 섹션을 선언하는 구문은 다음과 같습니다.

section.data

BSS의

그만큼 bss섹션은 변수 선언에 사용됩니다. bss 섹션을 선언하는 구문은 다음과 같습니다.

section.bss

텍스트 섹션

그만큼 text섹션은 실제 코드를 유지하는 데 사용됩니다. 이 섹션은 선언으로 시작해야합니다.global _start, 프로그램 실행이 시작되는 위치를 커널에 알려줍니다.

텍스트 섹션을 선언하는 구문은 다음과 같습니다.

section.text
   global _start
_start:

코멘트

어셈블리 언어 주석은 세미콜론 (;)으로 시작합니다. 공백을 포함하여 인쇄 가능한 모든 문자를 포함 할 수 있습니다. 다음과 같이 한 줄에 표시 될 수 있습니다.

; This program displays a message on screen

또는 명령과 함께 같은 줄에-

add eax, ebx     ; adds ebx to eax

어셈블리 언어 문

어셈블리 언어 프로그램은 세 가지 유형의 명령문으로 구성됩니다.

  • 실행 가능한 지침 또는 지침,
  • 어셈블러 지시문 또는 의사 작업 및
  • Macros.

그만큼 executable instructions 또는 간단히 instructions프로세서에게 무엇을해야하는지 알려주십시오. 각 명령어는operation code(opcode). 실행 가능한 각 명령어는 하나의 기계어 명령어를 생성합니다.

그만큼 assembler directives 또는 pseudo-ops어셈블리 프로세스의 다양한 측면에 대해 어셈블러에게 알립니다. 이들은 실행할 수 없으며 기계어 명령어를 생성하지 않습니다.

Macros 기본적으로 텍스트 대체 메커니즘입니다.

어셈블리 언어 문의 구문

어셈블리 언어 문은 한 줄에 하나씩 입력됩니다. 각 문은 다음 형식을 따릅니다.

[label]   mnemonic   [operands]   [;comment]

대괄호 안의 필드는 선택 사항입니다. 기본 명령어는 두 부분으로 구성됩니다. 첫 번째는 실행될 명령어 (또는 니모닉)의 이름이고 두 번째는 명령의 피연산자 또는 매개 변수입니다.

다음은 일반적인 어셈블리 언어 명령문의 몇 가지 예입니다.

INC COUNT        ; Increment the memory variable COUNT

MOV TOTAL, 48    ; Transfer the value 48 in the 
                 ; memory variable TOTAL
					  
ADD AH, BH       ; Add the content of the 
                 ; BH register into the AH register
					  
AND MASK1, 128   ; Perform AND operation on the 
                 ; variable MASK1 and 128
					  
ADD MARKS, 10    ; Add 10 to the variable MARKS
MOV AL, 10       ; Transfer the value 10 to the AL register

어셈블리의 Hello World 프로그램

다음 어셈블리 언어 코드는 화면에 'Hello World'문자열을 표시합니다.

section	.text
   global _start     ;must be declared for linker (ld)
	
_start:	            ;tells linker entry point
   mov	edx,len     ;message length
   mov	ecx,msg     ;message to write
   mov	ebx,1       ;file descriptor (stdout)
   mov	eax,4       ;system call number (sys_write)
   int	0x80        ;call kernel
	
   mov	eax,1       ;system call number (sys_exit)
   int	0x80        ;call kernel

section	.data
msg db 'Hello, world!', 0xa  ;string to be printed
len equ $ - msg     ;length of the string

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Hello, world!

NASM에서 어셈블리 프로그램 컴파일 및 연결

경로를 설정했는지 확인하십시오. nasmldPATH 환경 변수의 바이너리. 이제 위의 프로그램을 컴파일하고 연결하기 위해 다음 단계를 수행하십시오.

  • 텍스트 편집기를 사용하여 위 코드를 입력하고 hello.asm으로 저장합니다.

  • 저장 한 디렉토리와 동일한 디렉토리에 있는지 확인하십시오. hello.asm.

  • 프로그램을 조립하려면 다음을 입력하십시오. nasm -f elf hello.asm

  • 오류가있는 경우이 단계에서 이에 대한 메시지가 표시됩니다. 그렇지 않으면 프로그램의 개체 파일hello.o 생성됩니다.

  • 개체 파일을 연결하고 hello라는 실행 파일을 만들려면 다음을 입력합니다. ld -m elf_i386 -s -o hello hello.o

  • 입력하여 프로그램 실행 ./hello

모든 작업을 올바르게 수행하면 'Hello, world!'가 표시됩니다. 화면에.