본문 바로가기

* IT/Digital forensic

어셈블리어 기초


데이터 타입 :

 Type

Usage

 BYTE

8비트 부호없는 정수

 SBYTE

8비트 부호있는 정수

 WORD

16비트 부호없는 정수

 SWORD

16비트 부호있는 정수

 DWORD

32비트 부호없는 정수

 SDWORD

32비트 부호있는 정수

 FWORD

48비트 정수

 QWORD

64비트 정수

 TBYTE

80비트 정수

 REAL4

IEEE표준의 32비트 실수

 REAL8

IEEE표준의 64비트 실수

 REAL10

IEEE표준의 80비트 실수


피연산자(operand) 타입 :

피연산자 설명
r8 8비트 범용 레지스터
r16 16비트 범용 레지스터
r32 32비트 범용 레지스터
Reg 임의의 범용 레지스터
Sreg 16비트 세그먼트 레지스터
Imm 8, 16, 32비트 즉시값
imm8 8비트 즉시값
imm16 16비트 즉시값
imm32 32비트 즉시값
r/m8 8비트 범용 레지스터, 메모리
r/m16 16비트 범용 레지스터, 메모리
r/m32 32비트 범용 레지스터, 메모리
mem 8, 16, 32비트 메모리 

어셈블리 명령어 :

명  령  어

설                                               명

Data Transfer

MOV

Move

데이터 이동 (전송)

PUSH

Push

오퍼랜드의 내용을 스택에
쌓는다

POP

Pop

스택으로부터 값을 뽑아낸다.

XCHG

Exchange Register/memory with Register

첫 번째 오퍼랜드와 두 번째
오퍼랜드 교환

IN

Input from AL/AX to Fixed port

오퍼랜드로 지시된
포트로부터 AX에
데이터 입력

OUT

Output from AL/AX to Fixed port

오퍼랜드가 지시한
포트로 AX의 데이터
출력

XLAT

Translate byte to AL

BX:AL이 지시한
데이블의 내용을 AL로
로드

LEA

Load Effective Address to Register

메모리의 오프셋값을
레지스터로 로드

LDS

Load Pointer to DS

REG←(MEM),
DS←(MEM+2)

LES

Load Pointer ti ES

REG←(MEM),
ES←(MEM+2)

LAHF

Load AH with Flags

플래그의 내용을
AH의 특정 비트로 로드

SAHF

Store AH into Flags

AH의 특정 비트가
플래그 레지스터로
전송

PUSHF

Push Flags

플래그 레지스터의
내용을 스택에 쌓음

POPF

Pop Flags

스택으로부터 플래그
레지스터로 뽑음

Arithmetic

ADD

Add

캐리를 포함하지 않은
덧셈

SBB

Subtract with Borrow

캐리를 포함한 뺄셈

DEC

Decrement

오퍼랜드 내용을 1 감소

NEG

Change Sign

오퍼랜드의 2의 보수,
즉 부호 반전

CMP

Compare

두 개의 오퍼랜드를
비교한다

ADC

Add with Carry

캐리를 포함한 덧셈

INC

Increment

오퍼랜드 내용을 1 증가

AAA

ASCII adjust for Add

덧셈 결과 AL값을
UNPACK 10진수로
보정

DAA

Decimal adjust for Add

덧셈 결과의 AL값을
PACK 10진수로
보정

SUB

Subtract

캐리를 포함하지 않은 뺄셈

AAS

ASCII adjust for Subtract

뺄셈 결과 AL값을
UNPACK 10진수로
보정

DAS

Decimal adjust for Subtract

뺄셈 결과의 AL값을
PACK 10진수로
보정

MUL

Multiply (Unsigned)

AX와 오퍼랜드를
곱셈하여 결과를 AX
또는 DX:AX에 저장

IMUL

Integer Multiply (Signed)

부호화된 곱셈

AAM

ASCII adjust for Multiply

곱셈 결과 AX값을
UNPACK 10진수로
보정

DIV

Divide (Unsigned)

AX 또는 DX:AX
내용을 오퍼랜드로 나눔.
몫은 AL, AX 나머지는
AH, DX로 저장

IDIV

Integer Divide (Signed)

부호화된 나눗셈

AAD

ASCII adjust for Divide

나눗셈 결과 AX값을
UNPACK 10진수로
보정

CBW

Convert byte to word

AL의 바이트 데이터를
부호 비트를
포함하여 AX 워드로 확장

CWD

Convert word to double word

AX의 워드 데이터를
부호를 포함하여
DX:AX의 더블 워드로 변환

Logic

NOT

Invert

오퍼랜드의 1의 보수,
즉 비트 반전 

SHL/SAL

Shift logical / arithmetic Left

왼쪽으로 오퍼랜드만큼
자리 이동
(최하위 비트는 0)

SHR

Shift logical Right

오른쪽으로 오퍼
랜드만큼 자리 이동
(최상위 비트 0)

SAR

Shift arithmetic Right

오른쪽 자리이동,
최상위 비트는 유지

ROL

Rotate Left

왼쪽으로 오퍼랜드
만큼 회전 이동

ROR

Rotate Right

오른쪽으로 오퍼랜드
만큼 회전 이동

RCL

Rotate through Carry Left

캐리를 포함하여 왼쪽으로
오퍼랜드만큼
회전 이동

RCR

Rotate through Carry Right

캐리를 포함하여
오른쪽으로 오퍼랜드
만큼 회전 이동

AND

And

논리 AND

TEST

And function to Flags, no result

첫 번째 오퍼랜드와
두 번째 오퍼랜드를
AND하여 그 결과로
플래그 세트

OR

Or

논리 OR

XOR

Exclusive Or

배타 논리 합 (OR)

String Manipulation

REP

Repeat

REP 뒤에 오는 스트링
명령을 CX가 0이
될 때까지 반복

MOVS

Move String

DS:SI가 지시한 메모리
데이터를 ES:DI
가 지시한 메모리로 전송

CMPS

Compare String

DS:SI와 ES:DI의 내용을
비교하고 결과에
따라 플래그 설정

SCAS

Scan String

AL 또는 AX와 ES:DI가
지시한 메모리
내용 비교하고 결과에
따라 플래그 설정

LODS

Load String

SI 내용을 AL 또는
AX로 로드

STOS

Store String

AL 또는 AX를 ES:DI가
지시하는 메모리
에 저장

Control Transfer

CALL

Call

프로시저 호출

JMP

Unconditional Jump

무조건 분기

RET

Return from CALL

CALL로 스택에 PUSH된
주소로 복귀

JE/JZ

Jump on Equal / Zero

결과가 0이면 분기

JL/JNGE

Jump on Less / not Greater or Equal

결과가 작으면 분기
(부호화된 수)

JB/JNAE

Jump on Below / not Above or Equal

결과가 작으면 분기
(부호화 안 된 수)

JBE/JNA

Jump on Below or Equal / not Above

결과가 작거나 같으면
분기 (부호화
안 된 수)

JP/JPE

Jump on Parity / Parity Even

패리티 플레그가 1이면 분기

JO

Jump on Overflow

오버플로가 발생하면 분기

JS

Jump on Sign

부호 플레그가 1이면 분기

JNE/JNZ

Jump on not Equal / not Zero

결과가 0이 아니면 분기

JNL/JGE

Jump on not Less / Greater or Equal

결과가 크거나 같으면
분기 (부호화된 수)

JNLE/JG

Jump on not Less or Equal / Greater

결과가 크면 분기
(부호화된 수)

JNB/JAE

Jump on not Below / Above or Equal

결과가 크거나 같으면
분기 (부호화 안된 수)

JNBE/JA

Jump on not Below or Equal / Above

결과가 크면 분기
(부호화 안 된 수)

JNP/JPO

Jump on not Parity / Parity odd

패리티 플레그가
0이면 분기

JNO

Jump on not Overflow

오버플로우가 아닌
경우 분기

JNS

Jump on not Sign

부호 플레그가 0이면 분기

LOOP

Loop CX times

CX를 1감소하면서 0이 될
때까지 지정된
라벨로 분기

LOOPZ/LOOPE

Loop while Zero / Equal

제로 플레그가 1이고
CX≠0이면
지정된 라벨로 분기

LOOPNZ/LOOPNE

Loop while not Zero / not Equal

제로 플레그가 0이고
CX≠0이면
지정된 라벨로 분기

JCXZ

Jump on CX Zero

CX가 0이면 분기

INT

Interrupt

인터럽트 실행

INTO

Interrupt on Overflow

오버플로우가 발생하면
인터럽트 실행

IRET

Interrupt Return

인터럽트 복귀 (리턴)

Processor Control

CLC

Clear Carry

캐리 플레그 클리어

CMC

Complement Carry

캐리 플레그를 반전

CLD

Clear Direction

디렉션 플레그를 클리어

CLI

Clear Interrupt

인터럽트 플레그를 클리어

HLT

Halt

정지

LOCK

Bus Lock prefix

 

STC

Set Carry

캐리 플레그 셋

NOP

No operation

 

STD

Set Direction

디렉션 플레그 셋

STI

Set Interrupt

인터럽트 인에이블
플레그 셋

WAIT

Wait

프로세서를 일지 정지
상태로 한다

ESC

Escape to External device

이스케이프 명령

 

8086 지시어

 

 

지시어

내                                  용

형                                  식

SEGMENT
-
END

어셈블리 프로그램은 한 개 이상의 세그먼트들로 구성된다. SEGMENT 지시어는 하나의 세그먼트를 정의한다.

segname SEGMENT ;
세그먼트 시작
⋮ ; 세그먼트 내용
segname ENDS ;
세그먼트 끝

PROC
-
ENDP

매크로 어셈블리에서는 프로그램의 실행 부분을 모듈로 작성할 수 있다. 이 모듈을 프로시저(Procedure)라 부르며, PROC 지시어가 이를 정의한다.

procname PROC ;
프로시저의 시작
⋮ ;
프로시저의 내용
procname ENDP ;
프로시저의 끝

ASSUME

어셈블러에게 세그먼트 레지스터와 사용자가 작성한 세그먼트의 이름을 연결시킨다.

ASSUME SS:
stack_segname,
DS:data_segname,
CS:code_segname,
ES:extra_segname

END

전제 프로그램의 끝을 나타냄

END

데이터 정의 지시어 : 프로그램에서 데이터를 저장할 기억 장소를 정의, 초기값 부여

DB

Define Byte

name DB 초기값

DW

Define Word

name DW 초기값

DD

Define Double Word

name DD 초기값

DQ

Define Quad Word

name DQ 초기값

DT

Define Ten Bytes

name DT 초기값

EQU

변수 이름에 데이터값이나 문자열 정의

name EQU
데이터값/문자열

=

EQU와 달리 정의된 값을 변경 가능

 

EVEN

어셈블리시 이 지시어가 사용되는 곳의 주소가 짝수로 되도록 함

 

PAGE

어셈블리 리스트의 형식을 결정

PAGE [length][,width]

TITLE

어셈블리 리스트의 각 페이지에 제목 출력

TITLE text

 

출처:http://linkc.tistory.com/ 어셈블리어 정리

 

Hack My Mind

 

linkc.tistory.com