상세 컨텐츠

본문 제목

x86 어셈블리어 명령어

IT

by ALLSTATS 2022. 12. 1. 08:15

본문

반응형

안녕하세요

어셈블리어 공부를 하면서 주로 쓰이는 명령어들을 몇가지 정리를 해보았습니다.

아마 추가사항이 있을 경우에는 추가적으로 수정이 될듯합니다.

여기에 없는 명령어들도 있으며 x86 CPU 기준으로 사용되는 명령어입니다.

 

MOV 
앞의 레지스터에 뒤에 설정된 값을 넣음 
[ ] 사용시 해당 [ ] 안에 저장된 주소를 찾아가 주소에 있는 값을 세팅

CMP 
연산자끼리 비교

ADD
연산자와 피연산자의 덧셈후 앞의 레지스터에 저장

SUB 
연산자와 피연산자의 뺄셈후 앞의 레지스터에 저장



JMP
해당 register로 무조건 이동 

JZ(Jump if zero)
연산결과값이 zero일 경우 이동

JA(Jump above)
CMP로 비교시 앞의 값이 크면 이동 

JB(Jump below)
CMP로 비교시 앞의 값이 작으면 이동

JNA(Jump if not above)
CMP로 비교시 앞의 값이 크지않으면 이동
JBE(Jump if below eqaul)와 같음

JNB(Jump if not below)
CMP로 비교시 앞의 값이 작지않으면 이동
JAE(Jump if above eqaul)와 같음 

JG(Jump if greater)
부호있는 연산자를 CMP로 비교시 앞의 값이 큰 경우 이동 

JL(Jump if less)
부호있는 연산자를 CMP로 비교시 앞의 값이 작은 경우 이동

JNG(Jump if not greater)
부호있는 연산자를 CMP로 비교시 앞의 값이 크지않으면 이동
JLE(Jump if less eqaul)와 같음

JNL(Jump if not less)
부호있는 연산자를 CMP로 비교시 앞의 값이 작지않으면 이동
JGE(Jump if greater eqaul)와 같음

JO,JS,JC
overflow flag, sigh flag, carry flag
상태 레지스터가 참일경우 이동

JECXZ reg/mem
ECX가 0로 세팅될 경우 이동

JCXZ 
CX가 0로 세팅될 경우 이동

LOOP 
counter register(ECX, CX)가 0이 아닐 경우 이동
자동으로 CX를 1씩 감소

LOOPZ = LOOPE 
LOOP 조건 + ZF가 1로 설정시(연산결과가 0일시) 이동

LOOPNZ = LOOPNE 
LOOP 조건 + ZF가 0으로 설정시(연산결과가 0이 아닐시) 이동


NOP
No Operation
아무 작업을 하지않는 명령

MUL 
연산자와 피연산자의 곱셈후 앞의 레지스터에 저장

DIV 
연산자와 피연산자의 나눗셈후 앞의 레지스터에 저장

IMUL 
부호있는 숫자의 연산자와 피연산자의 곱셈

IDIV 
부호있는 숫자의 연산자와 피연산자의 나눗셈


AND 
비트를 and 연산하여 앞의 레지스터에 보관
둘다 참일 경우 참

OR 
비트를 or 연산하여 앞의 레지스터에 보관
하나만 참일 경우 참

XOR 
비트를 xor 연산하여 앞의 레지스터에 보관
다르면 1 같으면 0

NOT
비트를 not 연산

NEG
부호있는 정수의 대하여 2의 보수를 취한다
음수 양수 변환






STC,STD,STI
set 명령어로서 해당 플래그 레지스터(Carry,Direction,Interrupt)를 1로 set

CLC,CLD,CLI
clear 명령어로서 해당 플래그 레지스터(Carry,Direction,Interrupt)를 0으로 set

SHL, SHR 
논리 비트시프트 명령어 Left, Right 방향으로 가능

SAL, SAR, 
산술 비트시프트 명령어 Left, Right 방향으로 가능
부호있는 숫자의 부호를 유지하며 산술시프트 실행

ROL 
비트를 operand만큼 왼쪽으로 회전
MSB를 LSB로 이동

ROR 
비트를 operand만큼 오른쪽으로 회전
LSB를 MSB로 이동

RCL 
비트를 operand만큼 왼쪽으로 회전
MSB를 캐리플래그로 복사
캐리플래그를 LSB로 복사

RCR 
비트를 operand만큼 오른쪽으로 회전
LSB를 캐리플래그로 복사
캐리플래그를 MSB로 복사



 



PUSH 
스택에 해당 값을 넣음
BSP가 감소

POP 
스택에서 값을 꺼내 해당 레지스터에 넣음
BSP가 증가

PUSHAD
범용 레지스터를 전부 메모리에 PUSH
EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI 순서대로 들어간다

POPAD
PUSHAD로 넣은 스택을 전부 순서대로 다시 꺼내서 범용 레지스터로 복구

PUSHFD
상태 레지스터를 전부 메모리에 PUSH

POPFD
PUSHFD로 넣은 스택을 전부 순서대로 다시 꺼내서 상태 레지스터로 복구



CALL [주소값]
프로시저를 호출하는 명령
해당주소로 이동하여 프로시저를 실행

RET
프로시저를 종료하고 메인함수로 리턴하는 명령
CALL 실행시 스택에 PUSH된 주소값(다음에 실행될 주소)으로 리턴된다





LAHF(Load status flags into AH register)
상태 레지스터를 AH 레지스터로 이동
최상위 비트 순으로 SF : ZF : 0 : AF : 0 : PF : 1 : CF 순서로 이동 

SAHF(Store AH info register)
AH 레지스터를 상태 레지스터로 이동
최상위 비트 순으로 SF : ZF : 0 : AF : 0 : PF : 1 : CF 순서로 읽어온다

XCHG 
앞의 피연산자와 뒤의 피연산자에 저장된 데이터를 교환

LEA 
Load effective address
주소값 참조할때 사용, 플래그에는 영향을 미치지 않는다
두번째 operand의 결과값을 첫번째 레지스터로 이동



CBW (Convert byte word)
1바이트의 데이터를 2바이트로 확장
AL -> AX

CWD (Convert word dword)
2바이트의 데이터를 4바이트로 확장
AX -> DX:AX

CWDE (Convert word dword EAX)
2바이트의 데이터를 4바이트로 확장
AX -> EAX

CDQ (Convert dword qword)
4바이트의 데이터를 8바이트로 확장
EAX -> EDX:EAX




MOVSX 
부호있는 정수의 경우 확장시 부호를 감안하여 확장하여 앞의 레지스터에 보관

MOVZX 
부호없는 정수의 확장하여 앞의 레지스터에 보관

MOVS 
특정 주소에서 특정주소로 문자열을 이동시킨다.
ESI와 EDI에 각각 문자열 시작점 메모리 주소를 넣은후에 이동
MOVSB, MOVSW, MOVSD는 byte,word,dword 단위로 문자열 이동

REP (Repeat string Operation Prefix)
명령어 앞에 붙히는 접두사
ECX에 설정된 횟수만큼 해당 명령어를 반복  

CMPS (Compare String)
문자열 단위로 비교, 반복작업시 접두사는 REPE, REPNE로만 사용
CMPSB,CMPSW,CMPSD는 byte, word, dword 크기단위로 비교

REPE (REP Equals)
CMPS에만 사용가능한 REP 명령어
비교시 같을때까지 반복
ECX = 0, ZF = 0일 경우 반복

REPNE (REP Not Equals)
CMPS에만 사용가능한 REP 명령어
비교시 같지 않을때까지 반복
ECX = 0, ZF = 1일 경우 반복




Load는 RAM에서 CPU로 데이터를 가져오는것
Store는 CPU에서 RAM으로 데이터를 저장하는것

STOS EDI[mem] (Store String)
EAX에 있는 데이터를 EDI에 지정된 메모리 주소에 저장
STOSB,STOSW,STOSD는 byte, word, dword 크기단위로 저장

LODS(Load String)
EDI에 지정된 메모리 주소에 있는 데이터를 EAX에 로드
LODSB,LODSW,LODSD는 byte, word, dword 크기단위로 로드












반응형

관련글 더보기