티스토리 뷰

OS

어셈블리어 모음(Assembly code)

pwnbit 2013. 3. 24. 02:28
반응형

INC(Increase) : 피연산자에 1을 더한다. ZF, OF가 세트될 수 있다.  

ex) INC reg

DEC(Decrease) : 피연산자에 1을 뺀다. ZF, OF가 세트될 수 있다.   

ex) DEC reg

ADD(Add) : Destination에 Source의 값을 더해서 Destination에 저장하는 명령이다. ZF, OF, CF가 세트될 수 있다.    

ex) ADD eax, 123         => eax 레지스터에 123을 더해서 eax 레지스터에 저장한다.


SUB(Subtract) : Destination에 Source에 값을 빼서 Destination에 저장하는 명령이다.

                       ZF, OF, CF가 세트될 수 있다.            

ex) SUB eax, 123         => eax 레지스터에 123을 빼서 eax 레지스터에 저장한다.

 

MUL(Unsigned Integer Multiply) : 부호 없는 al, ax, eax의 값을 피연산자와 곱한다. OF, ZF가 세트될 수 있다.

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

ex) MUL reg

IMUL(Integer Muiltiplication) : 부호 있는 al, ax, eax의 값을 피연산자와 곱한다. CF, OF가 세트될 수 있다.
ex) IMUL r/m8
      IMUL r/m16
      IMUL r/m32          => 단일 피연산자이고 피연산자를 al, ax, eax에 곱한다.
ex) IMUL destination, value
      IMUL r16, r/m16    => value를 al, ax, eax와, 곱해서 destination에 저장한다.
ex) IMUL destination, value, value
      IMUL r16, r/m16, imm8  => value끼리 곱해서 destination에 저장한다.
      연산 결과가 destination 레지스터의 크기보다 크다면 OF, CF가 세트된다.

DIV(Unsigned Integer Divide) : 8, 16, 32비트 부호 없는 정수의 나눗셈을 수행한다. CF, OF, ZF가 세트될 수 있다.
ex) DIV reg

MOV(Move) : Source에서 Destination으로 데이터를 복사한다.
ex) MOV Destination, Source
      MOV reg, reg

MOVS(Move String) : Source에서 Destination으로 데이터를 복사한다.
ex) MOVS Destination, Source

MOVSB, MOVSW, MOVSD(Move String): SI 또는 ESI 레지스터에 의해 지정된 메모리 주소의 내용을 DI 또는 EDI 레지스터에 의해 지정되는 메모리 주소로 복사한다.
MOVSB는 BYTE단위로 복사, MOVSW는 WORD단위로 복사, MOVSD는 DWORD단위로 복사한다.
방향 플래그(DF)가 1로 세트되어 있으면 ESI와 EDI는 복사 시에 감소하게 되고 DF가 0으로 세트되어 있으면 ESI와 EDI는 복사 시에 증가하게 된다.

MOVSX(Move with Sign-Extend) : BYTE나 WORD 크기의 피연산자를 WORD나 DWORD 크기로 확장하고 부호는 그대로 유지한다.
ex) MOVSX reg32, reg16  => reg16을 확장하여 reg32에 복사

MOVZX(Move with Zero-Extend) : BYTE나 WORD 크기의 피연산자를 WORD나 DWORD 크기로 확장하고 남은 비트는 0으로 채운다.
ex) MOVZX reg32, reg16  => reg16을 확장해서 남은비트를 0으로 채운후 reg32에 복사

 

INT(Interrupt) : 소프트웨어 인터럽트를 발생시켜 운영체제의 서브루틴을 호출한다.
ex) INT imm

AND(Logical AND) : Destination과 Source 피연산자의 각 비트가 AND 연산된다. 

                             각 비트가 모두 1일때만 1 OF, CF가 0으로 세트, ZF가 1로 세트될 수 있다.

OR(Inclusive OR) : Destination과 Source 피연산자의 각 비트가 OR 연산된다.
                            각 비트가 모두 0이면 0이고 모두 0이 아니면 1이다.

                            OF, CF가 0으로 세트, ZF가 1로 세트될 수 있다.

XOR(Exclusive OR) : Destination과 Source 피연산자의 각 비트가 XOR 연산된다.
                               각 비트가 서로 다른 값을 때만 1, 같은 값이라면 0.
                               OF, CF가 0으로 세트, ZF가 1로 세트될 수 있다.
                               레지스터를 0으로 초기화시킬 때 MOV 명령어를 사용하기 보단 XOR reg, reg으로 많이 사용

TEST(Test) : 두 피연산자 사이에 논리적인 AND 연산을 수행하여 플래그 레지스터에 영향을 주지만 결과값은 저장하지 않는다. OF, CF는 항상 0으로 세트, TEST 연산 결과값이 0이면 ZF가 1로 세트, 0이 아니면 ZF가 0으로 세트된다.
ex) TEST reg, regTEST reg, imm

STC(Set Carry Flag) : 캐리 플래그(CF)를 1로 세트한다.

CLC(Clear Carry Flag) : 캐리 플래그(CF)를 0으로 세트한다.

STD(Set Direction Flag) : 방향 플래그(DF)를 1로 세트한다.

CLD(Clear Direction Flag) : 방향 플래그(DF)를 0으로 세트한다.

STI(Set Interrupt Flag) : 인터럽트 플래그(IF)를 1로 세트한다.

CLI(Clear Interrupt Flag) : 인터럽트 플래그(IF)를 0으로 세트한다.

SHL(Shift Left) : Destination 피연산자를 Source 피연산자의 크기만큼 왼쪽으로 각 비트를 시프트시킨다.
                        최상위 비트는 캐리 플래그(CF)로 복사되고 최하위 비트는 0으로 채워진다.
ex) SHL reg, imm8SHL mem, imm8

SHR(Shift Right) : Destination 피연산자를 Source 피연산자의 크기만큼 오른쪽으로 각 비트를 시프트 시킨다.
                          최상위 비트는 0으로 채워지고 최하위 비트는 캐리 플래그(CF)로 복사된다.
ex) SHR reg, imm8SHR mem, imm8

PUSH(Push on Stack) : 스택에 값을 넣는다. ESP의 값이 4만큼 줄어들고 이 위치에 새로운 값이 채워진다.
ex) PUSH reg16

PUSHAD(Push ALL) : EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP 레지스터의 값을 스택에 PUSH한다.
                               레지스터들의 값을 보관해야 할 필요가 있을 때 사용한다.

PUSHFD(Push Flags) : 플래그 레지스터를 스택에 PUSH한다.
                                  플래그 레지스터의 값을 보관해야 할 필요가 있을 때 사용한다.

POP(Pop from Stack) : ESP 레지스터가 가리키고 있는 위치의 스택 공간에서 4byte 만큼을 Destination 피연산자에 복사하고 ESP 레지스터의 값에 4를 더한다.

 

POPAD(Pop All Flags from Stack) : 스택에 존재하는 값을 EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP 레지스터로 POP한다.  스택에 보관해 놓은 레지스터 정보를 다시 이용하려고 할 때 사용.

POPFD(Pop Flags from Stack) : 스택에 존재하는 값을 플래그 레지스터로 POP한다.
                                             스택에 보관해 놓은 레지스터 정보를 다시 이용하려고 할 때 사용한다.

XCHG(Exchange) : 두 피연산자의 내용이 서로 교환된다. imm 값이 피연산자로 올 수 없다.

NEG(Negate) : 피연산자의 2의 보수를 계산하여 결과를 피연산자에 저장한다.

PTR : 피연산자의 크기를 재설정한다.
ex) MOV eax, DWORD PTR value    => value의 크기를 DWORD 크기로 재설정하여 eax 레지스터에 복사

OFFSET : 세그먼트의 시작으로부터 변수가 위치한 거리까지의 상대적 거리를 리턴한다.
ex) MOV esi, OFFSET value   => value가 존재하는 위치를 세그먼트 시작 지점부터의 상대적 거리를 구해서 esi 레지스터에 복사하라는 의미.

LEA(Load Effective Address) : Source 피연산자의 유효 주소를 계산하여 Destination 피연산자에 복사한다. 간단히 주소를 알아내서 복사하는 명령어라고 생각하면 쉽다.

REP(Repeat String) : ECX 레지스터를 카운터로 사용해서 문자열 관련 명령을 ECX>0인 동안 반복
ex) REP MOVS destination, source

JMP(Jump Unconditionally to Lable) : 피연산자의 위치로 실행 흐름이 변경된다. 피연산자가 가리키는 코드로 점프 뛰어서 실행한다고 생각하면 된다. 피연산자에는 레이블이나 레지스터, 메모리 값이 올 수 없다.

CALL(Call a Procedure) : 함수 호출시 사용. JMP 명령어 같이 프로그램의 실행 흐름이 변경되지만 JMP 명령어와 다른 점으 되돌아올 리턴 어드레스(CALL 다음 명령)를 스택에 저장한다는 것이다. 그렇기 때문에 함수 호출 후 원래 위치로 실행 흐름을 되돌릴 수 있다.

CMP(Compare) : 두 피연산자를 비교하는 작업. Destination 피연산자에서 Source 피연산자를 묵시적으로 빼서 값을 비교한다. 두 피연산자의 값으 같다면 0, ZF가 1로 세트된다. 다르다면 ZF는 0으로 세트된다.

NOP(No Operation) : 아무 일도 하지 않는 명령어이다.

 






반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함
300x250