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

이대현·2020년 11월 27일
1

42SEOUL

목록 보기
15/24

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 함수를 어셈블리어로 짠다면?에서 실제 프로그램을 작성해보자.

profile
삽질의 기록들 👨‍💻

0개의 댓글