x86 어셈블리 언어
둘러보기로 이동
검색으로 이동
x86 어셈블리 언어는 Intel의 x86계열 CPU를 위한 어셈블리 언어에 대한 문서이다.
문법
명령어 형식
(접두어) 니모닉 (오퍼랜드1) (,오퍼랜드2) (,오퍼랜드)
명령어의 각 구성요소 사이는 공백 대신 탭을 사용하여도 무방하다. ()로 둘러쌓인 구성요소는 생략가능하다.
- 니모닉(mnemonics) : 기계어와 1대1 대응하는 어셈블리어의 명령어. 숫자로이루어진 기계어와 달리 우리에게 친숙한 단어이기 때문에 알아보기가 쉽다.
- 오퍼랜드(operand) : 흔히 말하는 파라메터. 레지스터나 메모리 주소, 상수 값 등이 될 수 있다.
주석
;(세미콜론)뒤에 오는 문자열은 모두 주석으로 처리한다.
MOV AX, 0x80 ; AX레지스터에 0x80을 넣는다.
접두어
접두어 | 설명 | 사용가능 명령 |
---|---|---|
REP | REPeat. 문자열 조작 명령을 1회 수행할 때 마다 CX를 1 감소시킨다. CX가 0이될 때 까지 반복한다. | MOVS, LODS, STOS |
REPZ | REPeat while Zero. 문자열 조작 명령을 1회 수행할 때 마다 CX를 1 감소시킨다. CX가 0이 아니고 ZF가 1일 경우 반복한다. | CMPS |
REPNZ | REPeat while Not Zero. 문자열 조작 명령을 1회 수행할 때 마다 CX를 1 감소시킨다. CX가 0이 아니고 ZF가 0일 경우 반복한다. | SCAS |
명령어(니모닉)
점프
명령어 | 파라메터 | 설명 | 비고 |
---|---|---|---|
JMP | 2byte | 지정한 주소로 IP레지스터를 변경한다. | 기계어로 변환시에는 JMP명령의 메모리주소로부터 상대적 주소로 변환된다. |
JZ JE |
1byte | ZF==1이면 지정한 주소로 IP레지스터를 변경한다. | |
LOOP | 1byte | CX가 0이 아니라면 지정된 주소로 IP레지스터를 변경하고 CX를 1 감소시킨다. |
문자열 조작
문자열 조작 명령어는 다루는 데이터 단위에 따라 마지막 문자가 바뀐다. 마지막 문자가 없으면 기본적으로 바이트 단위이다. (예: MOVS == MOVSB) 다루는 데이터에 따라 이용하는 레지스터의 크기도 바뀌며 SI와 DI도 단순 증감이 아니라 데이터 크기에 맞게 증감한다.
명령어 | 동작 | 설명 | 비고 |
---|---|---|---|
MOVS (+B,+W,+D,+Q) | MOV [DI], [SI] INC(DEC) SI INC(DEC) DI |
REP접두어와 조합하여 SI로지정한 주소로부터 DI로 지정한 주소로 데이터를 전송한다. | 블록 전송 |
LODS (+B,+W,+D,+Q) | MOV AL, [SI] INC(DEC) SI |
SI로 지정한 주소로부터 AL(혹은 AX, EAX, RAX)레지스터로 데이터를 로드한다. REP접두어와 조합은 거의 하지 않는다. | 데이터 로드 |
STOS (+B,+W,+D,+Q) | MOV [DI], AL INC(DEC) DI |
DI로 지정한 주소에 AL(혹은 AX, EAX, RAX)레지스터의 데이터를 보관한다. REP접두어와 조합하여 AL레지스터의 내용을 차례차례로 보관한다. | 데이터 보관 블록 초기화 |
CMPS (+B,+W,+D,+Q) | CMP [SI], [DI] INC(DEC) SI INC(DEC) DI |
REPZ접두어와 조합하여, SI로 지정한 블록과 DI로 지정한 블록을 비교하여 값이 다른 곳에서 정지한다. | 블록 비교 |
SCAS (+B,+W,+D,+Q) | CMP AL, [DI] INC(DEC) DI |
REPNZ접두어와 조합하여, DI로 지정한 블록과 AL(혹은 AX, EAX, RAX)레지스터의 값을 비교하여 같은 값을 찾으면 멈춘다. | 블록 내 데이터 탐색 |
서브루틴
명령어 | 파라메터 | 설명 | 비고 |
---|---|---|---|
CALL | |||
RET |
플래그
명령어 | 파라메터 | 설명 | 비고 |
---|---|---|---|
CLD | 플래그 DF를 0으로 클리어. | ||
STD | 플래그 DF를 1로 설정. |
x86 관련 문서
- x86 아키텍쳐 CPU : 8086, 486
- x86 레지스터
- x86 어셈블리 언어
- 인텔 아키텍처 매뉴얼