IT/embedded

어셈블리 데이터 타입/명령어

lowsec 2016. 1. 26. 21:35

데이터 타입


타 입

설 명

BYTE

8비트 부호 없는 정수

SBYTE

8비트 부호 있는 정수

WORD

16비트 부호 없는 정수

SWORD

16비트 부호 있는 정수

DWORD

32비트 부호 없는 정수

SDWORD

32비트 부호 있는 정수

FWORD

48비트 정수

QWORD

64비트 정수

TBYTE

80비트 정수


 

피연산자 타입


피연산자

설 명

r8

8비트 범용 레지스터

r16

16비트 범용 레지스터

r32

32비트 범용 레지스터

Reg

임의의 범용 레지스터

Sreg

16비트 세그먼트 레지스터

Imm

8, 16, 32비트 즉시값

im8

8비트 즉시값

imm16

16비트 즉시값

imm32

32비트 즉시값

r/m8

8비트 범용 레지스터, 메모리

r/m16

16비트 범용 레지스터, 메모리

r/m32

32비트 범용 레지스터, 메모리

mem

8, 16, 32비트 메모리


 

명령어

 

INC(increase)

피 연산자에 1을 더한다.

※ 연산결과에 따라 ZF나 OF가 세트 될 수 있다.

 

DEC(decrease)

피연산자에 1을 뺀다.

※ 연산결과에 따라 ZF나 OF가 세트 될수 있다.

 

ADD(add)

Destination에 source의 값을 더해서 Destination에 저장하는 한다.

※ 연산결과에 따라 ZF, OF, CF가 세트 될 수 있다.

ex) ADD eax, 1 (eax 레지스터에 1을 더해서 eax 레지스터에 저장)

 

SUB(Subtract)

Destination에 Source의 값을 빼서 Destination에 저장하는 명령이다.

※ 연산결과에 따라 ZF, OF, CF가 세트 될 수 있다.

ex) SUB eax, 1 (eax 레지스터에 1을 빼서 eax 레지스터에 저장)

 

MUL(unsigned Integer Multiply)

피연산자가 8비트이면 al과 곱해서 ax에 저장되고 16비트이면 ax와 곱하고 dx:ax에 저장된다.

※ 연산결과에 따라 ZF, OF가 세트 될 수 있다.

 

IMUL(integer Multiplication)

부호 있는 al, ax, eax의 값을 피연산자와 곱한다.

※ 연산결과에 따라 CF, OF가 세트 될 수 있다.

 

DIV(Unsigned Integer Divide)

8,16,32비트 부호없는 정수의 나눗셈을 한다.

※ 연산결과에 따라 CF, OF, ZF가 세트 될 수 있다.

 

MOV(Move)

Source에서 Destination으로 데이터를 복사한다.

ex) MOV Destination, Source

 

MOVS(Move String)

위와 같다.

※ MOVSB 는 BYTE단위로 복사, MOVSW는 WORD단위로 복사, MOVSD는 DWORD단위로 복사한다.

MOVSX, MOVZX는 크기를 확장하고 INT는 인터럽트를 발생시키는 명령어인데, 따로 설명은 안하겠다.

 

AND, OR, XOR은 Skip!!

 

TEST(test)

두 피연산자 사이에 AND를 수행하여 flag 레지스터에 영향을 주지만 결과값은 저장하지 않는다. OF, CF는 항상 0으로 세트되고 TEST 연산 결과값이 0이면 ZF가 1로 세트, 0이 아니면 ZF가 0으로 세트된다.

ex) TEST reg, mem

 

STC(Set Carry Flag)

Carry Flag를 1로 세트한다.

 

CLC(Clear Carry Flag)

Carry Flag를 0으로 세트한다.

 

STD(Set Direction Flag)

Direction flag를 1로 세트한다.

 

CTD(Clear Direction Flag)

Direction flag를 0으로 세트한다.

 

STI(Set Interrupt Flag)

Interrupt Flag를 1로 세트한다.

 

CLI(Clear Interrupt Flag)

Interrupt Flag를 0으로 세트한다.

 

SHL(Shift Left)

Destination 피연산자를 Source 피연산자의 크기만큼 왼쪽으로 shift한다.

최상위 비트는 carry flag로 복사되고, 최하위 비트는 0으로 채워진다.

 

SHR(Shift Right)

오른쪽으로 shift한다.

최상위 비트는 0으로 채워지고, 최하위 비트는 carry flag로 복사된다.

 

PUSH(Push on Stack)

스택에 값을 넣는다.

ESP의 값이 4만큼 줄어들고 이 위치에 새로운 값이 채워진다.

※ stack은 일반적인 교과서에서 밑에서부터 차곡차곡 쌓아올리는 식으로 배우지만, 여기서는 거꾸로 매달려있어서 위에서부터 아래로 늘어난다고 생각하는 것이 이해하기에 좋다.

※ PUSHFD는 플래그 레지스터를 스택에 PUSH하는 명령어 (설명 생략)

 

POP(Pop from Stack)

ESP 레지스터가 가리키고 있는 스택 공간에서 4byte만큼 Destination에 복사하고 ESP 레지스터의 값에 4를 더한다.

※ POPAD는 스택에 존재하는 값을 EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP레지스터로 POP한다.

POPDF는 스택에 존재하는 값을 플래그 레지스터로 POP한다.

 

XCHG(피연산자간 저장 값 교환), NEG(DST의 값을 2의 보수취해서 저장), PTR(피연산자의 크기 재설정), OFFSET(세그먼터의 시작으로부터 변수가 위치한 거리까지의 상대적 거리를 리턴)

 

LEA(Load Effective Address)

Source 피연산자의 유효 주소를 계산하여 Destination 피연산자에 복사한다.

포인터 등을 위해서 주소를 알아내서 복사하는 명령어다

ex) LEA reg, mem

 

REP(Repeat String)

ECX 레지스터를 카운터로 사용해서 문자열 관련 명령을 ECX > 0인 동안 반복한다.

 

JMP(Jump Unconditionally to Label)

피연산자가 가리키는 코드로 점프해서 실행한다.

 

CALL(Call a Procedure)

함수 호출시 사용된다.

CALL을 수행하면 되돌아올 리턴 어드레스를 스택에 저장하게 되고 함수가 끝나면 이 리턴어드레스를 사용해서 원래 위치로 되돌아올 수 있다.

 

CMP(Compare)

두 피연산자를 비교한다. 빼기 연산을 통해서 결과가 0이 나오면 값을 같다고 판단하고 ZF가 1로 세트된다.

다르면 ZF는 0으로 세트된다.

 

NOP(No Operation)

아무 일도 하지 않는 명령어이다.

시간지연을 시켜 파이프라이닝의 해저드를 피하는 등 목적에 따라 유용하게 사용될 수 있다.

 

 

조건 점프 명령

조건 점프 명령을 JMP 명령어와는 다르게 CMP명령같이 특정 플래그 레지스터를 변경시킬 수 있는 명령어를 통해서 특정 조건이 만족하게 된다면 점프를 수행하게 되는 명령어이다.

직접 찾아보자. 양이 너무 많다...