본문 바로가기
잡동사니/시스템

[시스템] 어셈블리어 정리

by 2KB 2016. 5. 5.


1. Register


가. 범용 레지스터


1) EAX(Extended Accumulator Register)

곱셈, 나눔셈 명령에서 자동으로 사용하고 함수의 리턴 값이 저장되는 용도.

대부분의 레지스터가 포함된 연산에 들어간다고 보면 됨.


2) EBX(Extended Base Register)

ESIEDI와 결합하여 인덱스로 사용.


3) ECX(Extended Counter Register)

반복 명령어 사용시 카운터로 사용.

ECX에 반복할 횟수를 지정하여 반복 작업을 수행.


4) EDX(Extended Data Register)

EAX와 같이 사용하여 부호 확장 명령 등에 사용.


5) ESI(Extended Source Index)

데이터 복사나 조작할 때 Source Data의 주소를 저장.

EDI 레지스터가 가리키는 주소로 복사하는 용도로 많이 사용.


6) EDI(Extended Destination Index)

복사 작업시 Destination의 주소를 저장.

ESI 레지스터가 가리키는 주소의 데이터가 복사된다.


7) ESP(Extended Stack Pointer)

스택 프레임의 끝 지점 주소를 저장.

PUSH, POP에 따라 ESP의 값이 4Byte씩 바뀜.


8) EBP(Extended Base Pointer)

스택 프레임이 시작되는 주소를 저장.

스택 프레임은 하나의 함수 영역이라고 생각 하면 됨.

 

레지스터는 확장되어 있기 때문에 일부분만 가져다 쓸 수 있다.

32bit

16bit

상위 8bit

하위 8bit

32bit

16bit

EAX

AX

AH

AL

ESI

SI

EBX

BX

BH

BL

EDI

DI

ECX

CX

CH

CL

EBP

BP

EDX

DX

DH

DL

ESP

SP

 

나. 명령 포인터 레지스터


1) EIP(Extended Instruction Pointer)

다음에 실행할 명령어 주소가 들어 있는 레지스터

 


다. 세그먼트 레지스터


1. CS(Code Segment)

코드가 존재하는 세그먼트의 오프셋이 저장되는 레지스터


2. DS(Data Segment)

프로그램에서 사용할 데이터가 존재하는 세그먼트의 오프셋이 저장되는 레지스터


3. SS(Stack Segment)

스택이 존재하는 세그먼트의 오프셋이 저장되는 레지스터

 

컴파일 되는 시점에서 메모리의 어느 위치에 프로그램이 들어갈지 알 수 없기 때문에 세그먼트 단위로 기록을 하여 동적 로딩이 가능 하게 함.

실제 주소는 세그먼트 + 주소로 계산 됨 ex) DS + ESI 이런식...

 

라. 상태 플래그 레지스터


1) CF(carry Flag) : 부호 없는 연산 결과가 용량보다 클 때 1로 세팅.

2) PF(Parity Flag) : 연산 결과 1이 짝수이면 1, 홀수이면 0으로 세팅.

3) AF(Auxiliary Flag) : 연산 결과 하위 4bit에서 Carry가 발생 시 1로 세팅.

4) ZF(Zero Flag) : 연살 결과가 0일 때 1로 세팅, 0이 아닐 때 0으로 해제.

5) SF(Sign Flag) : 연산 결과가 음수가 되었을 때 1로 세팅, 양수일 때 0으로 해제.

6) TF(Trap Flag) : 디버거의 브레이크 포인트라고 생각하면 됨.

7) DF(Direction Flag) : 문자열 방향 플래그 1일 경우 감소, 0일 경우 증가.

8) OF(Overflow Flag) : 부호 있는 연산 결과가 용량보다 클 때 1로 세팅.

연산이 이루어지면 플래그가 변화되기 때문에 주로 분기문을 사용하는 조건으로 씀.

 

2. Data Type


가. 데이터 타입


1) BYTE : 8bit 부호 없는 정수

2) SBYTE : 8bit 부호 있는 정수

3) WORD : 16bit 부호 없는 정수

4) SWORD : 16bit 부호 있는 정수

5) DWORD : 32bit 부호 없는 정수

6) SDWORD : 32bit 부호 있는 정수

7) FWORD : 48bit 정수

8) QWORD : 64bit 정수

9) TBYTE : 80bit 정수

S = Sign / D = Double / Q = Quarter ...

 

나. 피연산자(operand) 타입


1) r8 : 8bit 범용 레지스터

2) r16 : 16bit 범용 레지스터

3) r32 : 32bit 범용 레지스터

4) Reg : 임의의 범용 레지스터

5) Sreg : 16비트 세그먼트 레지스터

6) Imm : 8, 16, 32비트 즉시 값

7) imm8 : 8bit 즉시 값

8) imm16 : 16bit 즉시 값

9) imm32 : 32bit 즉시 값

10) r/m8 : 8bit 범용 레지스터, 메모리

11) r/m16 : 16bit 범용 레지스터, 메모리

12) r/m32 : 32bit 범용 레지스터, 메모리

13) mem : 8, 16, 32bit 메모리

 

3. Assembly Operation


가. 증감 연산


1) INC(Increase)

INC reg

INC mem

피연산자에 1을 더한다.

ZF, OF에 영향


2) DEC(Decrease)

DEC reg

DEC mem

피연산자에 1을 뺀다.

ZF, OF에 영향

 

나. 사칙 연산


1) ADD(Add)

ADD destination, source

ADD reg, reg

ADD reg, imm

ADD mem, reg

ADD mem, imm

ADD reg, mem

destinationsource를 더하여 destination에 저장.

ZF, OF, CF에 영향


2) SUB(Subtract)

SUB destination, source

SUB reg, reg

SUB reg, imm

SUB mem, reg

SUB mem, imm

SUB reg, mem

destinationsource를 빼서 destination에 저장.

ZF, OF, CF에 영향


3) MUL(Unsigned Integer Multiply)

MUL reg

MUL mem

부호 없는 AL, AX, EAX 값을 피연산자와 곱함.

피연산자가 8bit이면 AL과 곱하여 AX에 저장.

피연산자가 16bit이면 AX와 곱하여 EAX에 저장.

피연산자가 32bit이면 EAX와 곱하여 EDX:EAX에 저장.

OF, ZF에 영향


4) IMUL(Integer Multiply)

IMUL r/m8

IMUL r/m16

IMUL r/m32

부호 있는 AL, AX, EAX 값을 피연산자와 곱함.

피연산자가 8bit이면 AL과 곱하여 AX에 저장.

피연산자가 16bit이면 AX와 곱하여 EAX에 저장.

피연산자가 32bit이면 EAX와 곱하여 EDX:EAX에 저장.

CF, OF에 영향


5) DIV(Unsigned Integer Divide)

DIV reg

DIV mem

8, 16, 32bit 부호 없는 정수의 나눗셈.

피연산자가 8bit이면 AL과 나누어 AL에 저장.

피연산자가 16bit이면 AX와 나누어 AX에 저장.

피연산자가 32bit이면 EAX와 나누어 EAX에 저장.

CF, OF, ZF에 영향

 

다. 비트 연산


1) AND(Logical AND)

AND destination, source

AND reg, reg

AND reg, imm

AND mem, reg

AND mem, imm

AND reg, mem

두 피연산자를 AND연산하여 destination에 저장.

OF, CF, ZF에 영향


2) OR(Inclusive OR)

OR destination, source

OR reg, reg

OR reg, imm

OR mem, reg

OR mem, imm

OR reg, mem

두 피연산자를 OR연산하여 destination에 저장.

OF, CF, ZF에 영향


3) XOR(Exclusive OR)

XOR destination, source

XOR reg, reg

XOR reg, imm

XOR mem, reg

XOR mem, imm

XOR reg, mem

두 피연산자를 XOR연산하여 destination에 저장.

OF, CF, ZF에 영향

레지스터 초기화시 XOR reg, reg 많이 씀


4) SHL(Shift Left)

SHL reg, imm8

SHL mem, imm8

SHL reg, CL

SHL mem, CL

피연산자를 source 크기만큼 좌측으로 시프트.

최상위 bitCF에 저장.

최하위 bit0으로 채움.


5) SHR(Shift Right)

SHR reg, imm8

SHR mem, imm8

SHR reg, CL

SHR mem, CL

피연산자를 source 크기만큼 우측으로 시프트.

최상위 bit0으로 채움.

최하위 bitCF에 저장.

 

라. 비교 연산


1) CMP(Compare)

CMP reg, reg

CMP reg, imm

CMP mem, reg

CMP mem, imm

CMP reg, mem

두 피연산자를 뺄셈 연산을 하여 비교.

두 피연산자가 같을 시 ZF = 1, 다를 시 ZF = 0.


2) TEST(Test)

TEST reg, reg

TEST reg, imm

TEST mem, reg

TEST mem, imm

TEST reg, mem

두 피연산자를 AND 연산을 하여 비교.

OF, CF = 0으로 세팅, 결과가 같을 시 ZF = 1, 다를 시 ZF = 0.

 

마. 데이터 이동


1) MOVE(Move)

MOVE destination, source

MOVE reg, reg

MOVE reg, imm

MOVE mem, reg

MOVE mem, imm

MOVE reg, mem

주의!! mem, mem은 없음!!

source의 데이터를 destination으로 복사한다.

 

MOVS(Move String)

MOVSB(Move String Byte)

MOVSW(Move String Word)

MOVSD(Move String Double Word)


2) XCHG(Exchange)

XCHG reg, reg

XCHG reg, mem

XCHG mem, reg

두 피연산자의 내용을 서로 교체.

imm형은 피연산자로 올 수 없음!

 

바. 분기


1) JMP(Jump Unconditionally to Label)

JMP label

JMP reg16

JMP mem16

JMP mem32

피연산자가 가리키는 주소로 코드를 점프.

 

조건 점프

JA : CF = 0 and ZF = 0

JAE : CF = 0

JB : CF = 1

JBE : CF = 1 or ZF = 1

JC : CF = 1

JCXZ : CX = 0

JE : ZF = 1

JECXZ : ECX = 0

JG : ZF = 0 and SF = 0

JGE : SF = OF

JL : SF != Of

JLE : ZF = 1 and SF != OF

JNA : CF = 1 or ZF = 1

JNAE : CF = 1

JNB : CF = 0

JNBE : CF = 0 and ZF = 0

JNC : CF = 0

JNE : ZF = 0

JNG : ZF = 1 or SF != OF

JNGE : SF != OF

JNL : SF = OF

JNLE : ZF = 0 and SF=OF

JNO : OF = 0

JNP : PF = 0

JNS : SF = 0

JNZ : ZF = 0

JO : OP = 1

JP : PF = 1

JPE : PF = 1

JPO : PF = 0

JS : SF = 1

JZ : ZF = 1

 

사. 스택


1) PUSH(Push on Stack)

PUSH reg16

PUSH reg32

PUSH mem16

PUSH mem32

PUSH imm16

PUSH imm32

스택에 값을 넣음. ESP의 값이 4만큼 줄어들고 새로운 값으로 채워짐.

 

2) PUSHAD(Push All)

PUSHAD

EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP 레지스터를 스택에 넣음.


3) PUSHFD(Push Flag)

PUSHFD

플래그 레지스터를 스택에 넣음.


4) POP(Pop form Stack)

POP reg16

POP reg32

POP mem16

POP mem32

POP imm16

POP imm32

스택에서 값을 뺌. ESP의 값이 4만큼 늘어남.


5) POPAD(Pop All)

POPAD

EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP 레지스터를 스택에서 뺌.


6) POPFD(Pop Flag)

POPFD

플래그 레지스터를 스택에서 뺌.

 

아. 기타


1) INT(Interrupt)

INT imm

소프트웨어 인터럽트를 발생시커 운영체제의 서브루틴을 호출.


2) NEG(Negate)

NEG reg

NEG mem

피연산자의 2의 보수를 계산하여 결과를 피연산자에 저장.


3) PTR

MOV EAX, DWORD PTR value

피연산자의 크기를 재설정.


4) OFFSET

MOV ESI, OFFSET value

세그먼트로부터 변수가 위치한 거리까지의 상대적 거리를 반환.


5) LEA(Load Effective Address)

LEA reg, mem

source 피연산자의 유효주소를 계산하여 destination 피연산자에 복사.


6) REP(Repeat String)

REP MOVS destination, source

ECX 레지스터를 카운터로 사용하여 문자열 관련 명령을 ECX>0만큼 반복.


7) CALL(Call a Procedure)

CALL label

CALL mem16

CALL mem32

CALL reg

CALL 함수 주소

CALL DWORD PTR[EAX+5]

CALL <JMP to APT>

함수 호출!!!


8) RET

ret

함수 끝날 때 원래 주소로 복귀


9) NOP(No Operation)

NOP

아무것도 안함!!