1. Register
가. 범용 레지스터
1) EAX(Extended Accumulator Register)
곱셈, 나눔셈 명령에서 자동으로 사용하고 함수의 리턴 값이 저장되는 용도.
대부분의 레지스터가 포함된 연산에 들어간다고 보면 됨.
2) EBX(Extended Base Register)
ESI나 EDI와 결합하여 인덱스로 사용.
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
destination에 source를 더하여 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
destination에 source를 빼서 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 크기만큼 좌측으로 시프트.
최상위 bit는 CF에 저장.
최하위 bit는 0으로 채움.
5) SHR(Shift Right)
SHR reg, imm8
SHR mem, imm8
SHR reg, CL
SHR mem, CL
피연산자를 source 크기만큼 우측으로 시프트.
최상위 bit는 0으로 채움.
최하위 bit는 CF에 저장.
라. 비교 연산
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
아무것도 안함!!