어셈블리 명령어 상세  -  명령어의 분류

① 데이터 이동 : mov, lea

② 논리, 연산 : add, sub, inc, dec
③ 흐름제어 : cmp,jmp
④ 프로시져 : call, ret
⑤ 스택조작 : push, pop
⑥ 
인터럽트 : int

1) 데이터 이동

1. mov (move data)


- 형식 : mov SOURCE, DESTINATION

- 기능 : SOURCE위치에 들어있는 데이터를 복사하여 DESTINATION위치에 저장.
- 원칙 : 메모리와 레지스터(모든 연산은 레지스터에 저장된뒤 이루어진다.) 사이의 데이터이동, 레지스터와 레지스터 사이의 데이터 이동이나 값을 메모리나 레지스터에 대입할 때 사용한다. (SOURCE와 DESTINATION의 크기가 동일해야 한다.)

# DESTINATION레지스터가 CS가 될수 없다.(프로그램실행위치가 변경되기때문)(CS의 변경은 int, jmp, call, ret등의 명령으로 가능)
# SOURCE와 DESTINATION이 전부 메모리를 가르칠수 없다. (설계상 불가능)
# SOURCE가 직접지정방식일경우에는 DESTINATION은 CS일 수 없다.

2. lea

- 형식 : lea SOURCE, DESTINATION
- 기능 : SOURCE OPERAND에서 지정된 주소를 DESTINATION으로 로드한다. LEA의 주된 용도는 매개변수나 지역변수의 주소를 얻어오는 것이다. 예를 들어C언어에서 지역변수나 매개변수에&연산자를 사용한다면 컴파일러는 lea명령어를 생성한다.
- 원칙 : SOURCE OPERAND는 메모리에 위치해야하며, 변경될 주소는 index register나 DESTINATION에 정의된 주소여야 한다.

2) 논리, 연산 : add, sub, inc, dec

ㄱ. add

  - 형식 : add opr1, opr2
  - 기능 : opr2의 내용에 op1의 내용이 더해져서 그 결과를 opr2에 저장.
  - 원칙 : ! 두 개의 오퍼랜드 모두에 메모리로 조합되는 것은 불가능.

ㄴ. sub (subtract)

  - 형식 : sub opr1, opr2
  - 기능 : 첫번째 오퍼랜드로 부터 2번째 오퍼랜드 의 내용을 뺀 다음 결과를 첫 번째 오퍼
  - 원칙 : ! 메모리끼리는 뺄셈을 할수 없다.

ㄷ. inc (Increment)

  - 형식 : inc DESTINATION
  - 기능 : DESTINATION을 1 증가시키고 결과값을 다시 저장

ㄹ. dec (decrement)

  - 형식 : dec DESTINATION
  - 기능 : DESTINATION을 1 감소시키고 결과값을 다시 저장

3) 흐름 제어 : jmp, cmp

1. jmp

- 형식 : jmp proc

- 기능 : 프로그램의 흐름을 바꿀 때 사용. proc의 주소로 가서 그곳의 명령어를 실행.
if/else문, loop문(루프가 아직 끝나지 않았을때, 처음위치로 돌아가기 위해)
등에서 나타난다.

2. cmp

- 형식 : cmp value, value
ex1) cmp %eax, 0 (eax레지스터의 값을 0과 비교한다.)
ex2) je start (비교 결과가 같다면 start로 분기한다. 같지 않다면 je 다음에 오는 명령어를 실행한다.)

- 기능 : 두값을 비교하고 비교결과에 따라 분기한다. 보통 레지스터나 메모리 및 숫자의 크기를 비교한다.
cmp 명령어는
Zero, Sign, Overflow 등의 플래그를 set or clear 한다. 이 플래그의 결과에 의해서 Jcc 명령어들은 분기할 것인지를 결정한다. 보통 CMP 명령어 다음에 JE, JNE 등의 jmp관련 명령어가 위치한다.
- 원칙 : cmp 명령은 혼자 사용되지 않고 언제나 조건 점프 명령어나 조건 이동(mov) 명령어와 함께 사용된다.
-조건 점프 명령어:cmp 명령어의 결과에 따라 점프하는 명령어.

************************** 참고 **************************

[+] Unsigned 계열 (부호가 없는 값)
je : jump equal - 비교 결과가 같을 때 점프
jne : jump not equal - 비교 결과가 다를 때 점프
jz : jump zero - 결과가 0일 때 점프, je와 같음. (cmp 명령에서 결과가 같으면 0을 출력)
jnz : jump not zero - 결과가 0이 아닐 때 점프
ja : jump above - cmp a, b에서 a가 클 때 점프
jae : jump above or equal - 크거나 같을 때 점프
jna : jump not above - 크지 않을 때 점프
jnae : jump not above or equal - 크지 않거나 같지 않을 때 점프
jb : jump below - cmp a, b에서 a가 작을 때 점프
jbe : jump below or equal - 작거나 같을 때 점프
jnb : jump not below - 작지 않을 때 점프
jnbe : jump not below or equal - 작지 않거나 같지 않을 때 점프
jc : jump carry - 캐리 플래그가 1일 때 점프
jnc : jump not carry - 캐리 플래그가 0일 때 점프
jnp/jpo : jump not parity / parity odd - 패리티 플래그가 0일 때 / 홀수일 때 점프
jp/jpe : jump parity / parity even - 패리티 플래그가 1일 때 / 짝수일 때 점프
jecxz : jump ecx zero - ecx 레지스터가 0일때 점프

[+] Signed 계열 (부호가 있는 값)

jg : jump greater - cmp a, b에서 a가 클 때 점프
jge : jump greater or equal - 크거나 같을 때 점프
jng : jump not greater - 크지 않을 때 점프
jnge : jump not greater or equal - 크지 않거나 같지 않을 때 점프
jl : jump less - cmp a, b에서 a가 작을 때 점프
jle : jump less or equal - 작거나 같을 때 점프
jnl : jump not less - 작지 않을 때 점프
jnle : jump not less or equal - 작지 않거나 같지 않을 때 점프
jo/jno : jump overflow / not overflow - 오버플로 플래그가 1일 때 / 0일 때 점프
js/jns : jump sign / not sign - 사인(부호) 플래그가 1일 때(음수) / 0일 때(양수) 점프
조건 점프 명령을 조합하여 if ( a > b ), for, while등의 조건문 구현
********************************************************

4) 프로시져 : call, ret

1. call

- 형식 : call Target
- 기능 : 스택 상에서 CS를 다음에 오는 명령의 오프셋 어드레스를 PUSH하고 target으로 이동한다. 즉, 다른 함수로 제어를 옮긴다는 뜻이다. CALL 명령어 다음에 오는 명령어의 주소를 스택에 PUSH하고 주어진 주소로 제어를 옮긴다는 뜻(EIP를 변경시킴)

# CALL명령은 CALL명령 다음위치에 있는 명령의 주소를 스택에 push한다.

2. ret (return)

- 형식 : ret

- 기능 : 호출된 함수에서 호출한 함수로 복귀. esp에 있는 값을 꺼내서(pop) EIP레지스터에 할당한다. 즉, call명령 당시 push되었던 주소를 pop하여 eip에 넣는 것이다.

5) 스택조작 : push, pop

1. pop

- 형식 : pop DESTINATION

- 기능 : 스택 맨 윗부분(top)에서 하나의 워드를 DESTINATION에 로드(load).
그리고 스택포인터는 그 바로 전의 데이터를 가리킨다(point).

2. push

- 형식 : push DESTINATION
- 기능 : 메모리상에 설정된 스택이라는 공간에 데이터를 저장한다. 스택의 가장 윗부분에 데이터를 저장.
스택 포인터(esp)도 워드크기만큼 증가한다.

6) 인터럽트 : int

- 형식 : int (interrupt-type)

- 기능 : 운영체제에 할당된 인터럽트 영역을 system call.


/** 아래는 출처 입니다. **/
//////////////////////////////////////////////////////////////////////////////////////////
작성자 : bOBaNa

E-mail : zeroone2000@korea.com
작성일 : 2007년 3월 30일

Parse and Parse Assembly

(어셈블리어 입문자를 위한
어셈블리어 자료들의 모음)

에서 가져온 내용입니다. 원작자분께 감사의 뜻을 전합니다.
//////////////////////////////////////////////////////////////////////////////////////////







+ Recent posts

티스토리 툴바