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

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 자체에는 영향을 미치지 않는다.

    • 보통 rax의 값이 0인지 확인할 때 rax 0, 0 이런 식으로 사용된다.

    • 만약 TEST의 연산결과가 0이라면 ZF는 1로, 연산결과가 1이라면 ZF는 0으로 세트된다.

명령어와 레지스터에 대한 이해가 있다면 어셈블리 프로그램을 작성할 수 있다. 다음 글 [libasm] strlen 함수를 어셈블리어로 짠다면?에서 실제 프로그램을 작성해보자.

Last updated