---
description: Opcode로 사용하는 어셈블리 명령어는 엄청나게 많다. 자주 사용한다는 몇 가지 명령어만 정리해봤다
---

# \[libasm] 어셈블리 명령어(opcode) 정리

> Opcode로 사용하는 어셈블리 명령어는 엄청나게 많다. 자주 사용한다는 몇 가지 명령어만 정리해봤다. 추가 예정...

## 1. 조작 명령어

* **call** : 함수 호출
* **ret** : call로 호출된 함수를 종료하고 그 다음 명령줄로 이동
* **nop** : 아무것도 하지 않음
* **jmp** : 분기(라벨) 실행.
* **조건 점프 명령어 :** cmp 연산 결과에 따라 jmp
  * **je** : cmp A B 에서 **A = B** 일때 특정 라벨로 jmp
  * **jne** : cmp A B 에서 **A != B** 일때 특정 라벨로 jmp
  * **ja** : cmp A B 에서 **A > B** 일때 특정 라벨로 jmp
  * **jb** : cmp A B 에서 **A < B** 일때 특정 라벨로 jmp
  * **jae** : A >= B
  * **jbe** : A <= B
* **플래그 점프 명령어** :

## 2. 데이터 전송 명령어

* **push** : 스택에 값을 넣음
* **pop** : 스택에서 값을 가져옴
* **mov** : 인자2 값을 인자1에 대입(전달)
* **lea** : 인자2 주소를 인자1에 대입(전달)

## 3. 산술 명령어

* **inc** : 인자의 값을 1 증가
* **dec** : 인자의 값을 1 감소
* **add** : 인자2 값을 인자1에 더함
* **sub** :  인자2 값을 인자1에서 뺌
* **cmp** : 인자1,2의 값을 비교. 주로 위의 조건점프 명령어와 세트로 사용한다.
* **test** : 인자1과 인자2를 AND 연산한다. 이 연산의 결과는 ZF(zero flag)에만 영향을 미치고 Operand 자체에는 영향을 미치지 않는다.&#x20;
  * 보통 rax의 값이 0인지 확인할 때 `rax 0, 0` 이런 식으로 사용된다.&#x20;
  * 만약 TEST의 연산결과가 0이라면 ZF는 1로, 연산결과가 1이라면 ZF는 0으로 세트된다.

명령어와 레지스터에 대한 이해가 있다면 어셈블리 프로그램을 작성할 수 있다. 다음 글 [\[libasm\] strlen 함수를 어셈블리어로 짠다면?](https://velog.io/@hidaehyunlee/libasm-strlen-%ED%95%A8%EC%88%98%EB%A5%BC-%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC%EC%96%B4%EB%A1%9C-%EC%A7%A0%EB%8B%A4%EB%A9%B4)에서 실제 프로그램을 작성해보자.
