x86 어셈블리 언어

KANOTYPE WIKI
둘러보기로 이동 검색으로 이동

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 관련 문서