어셈블리-기본 구문
조립 프로그램은 세 부분으로 나눌 수 있습니다.
그만큼 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에서 어셈블리 프로그램 컴파일 및 연결
경로를 설정했는지 확인하십시오. nasm 과 ldPATH 환경 변수의 바이너리. 이제 위의 프로그램을 컴파일하고 연결하기 위해 다음 단계를 수행하십시오.
텍스트 편집기를 사용하여 위 코드를 입력하고 hello.asm으로 저장합니다.
저장 한 디렉토리와 동일한 디렉토리에 있는지 확인하십시오. hello.asm.
프로그램을 조립하려면 다음을 입력하십시오. nasm -f elf hello.asm
오류가있는 경우이 단계에서 이에 대한 메시지가 표시됩니다. 그렇지 않으면 프로그램의 개체 파일hello.o 생성됩니다.
개체 파일을 연결하고 hello라는 실행 파일을 만들려면 다음을 입력합니다. ld -m elf_i386 -s -o hello hello.o
입력하여 프로그램 실행 ./hello
모든 작업을 올바르게 수행하면 'Hello, world!'가 표시됩니다. 화면에.