Post

부트로더 - 4

부트로더 코드에 대해서 설명하기에 앞서 어셈블리어에 대해서 좀 알아야한다. 아무래도 가장 기계어에 가까운 부분이다 보니 C나 다른 언어로 짜는 것보다는 어셈블리어로 짜는게 좀 더 용이한 부분이 있다.

아래는 주로 사용되는 어셈블리어 명령어이다.

명령어 모음

사칙 연산

add A, B

  • A에 B를 더한 뒤 A에 저장

    sub A, B

  • A에 B를 뺀뒤 뒤 A에 저장

    mul A

  • A에 B를 곱한 뒤 A에 저장

    inc A

  • A의 값을 1 증가

    dec A

  • A의 값을 1 감소

    div A

  • AX나 DX:AX의 값을 A로 나누어 몫과 나머지를 각기 AL와 AH 또는 AX와 DX에 저장

논리 연산

and A, B

  • A에 B를 AND 한 후 A에 저장
    or A, B
  • A에 B를 OR 뒤 A에 저장

    xor A, B

  • A에 B를 XOR 뒤 A에 저장

    not A

  • A의 값을 반전

대입 및 분기

mov A, B

  • B에서 A로 값을 이동

    cmp A, B

  • 두 값을 비교하여 결과를 FLAGS 레지스터에 적용

    jmp A

  • A로 무조건 점프

    je A

  • 이전 비교 결과가 같았으면 A로 점프

    jne A

  • 이전 비교 결과가 같지 않았으면 A로 점프

    jz A

  • 이전 비교 결과가 0이었으면 A로 점프

    jnz A

  • 이전 비교 결과가 0이 아니었으면 A로 점프

    ja A

  • 이전 비교 결과가 A보다 B가 컸으면 A로 점프

    jna A

  • 이전 비교 결과가 A보다 B가 크지 않았으면 A로 점프

    jb A

  • 이전 비교 결과가 A보다 B가 작았으면 A로 점프

    jnb A

  • 이전 비교 결과가 A보다 B가 작지 않았으면 A로 점프

함수 호출

call A

  • 스택에 다음 명령 어드레스를 삽입후 A 위치로 이동, 함수 호출 용도로 사용

    ret A

  • 스택을 A 만큼 줄인 후에 되돌아갈 어드레스를 꺼내 해당 위치로 점프, CALL 과 같이 사용

스택 제어

push A

  • 스택에 A를 넣음

    pop A

  • 스택 제일 위에 있는 값을 꺼내 A에 저장

인터럽트

int A

  • A번째 소프트웨어 인터럽트를 발생

    cli

  • 인터럽트를 발생 불가능하도록 설정

    sti

  • 인터럽트를 발생 가능하게 설정

I/O 포트 제어

in A, B

  • I/O 포트 B에서 값을 입력 받아 A에 저장
  • 주변 장치에서 값을 읽어올때 사용

    out B, A

  • A의 값을 I/O 포트 B에 출력
  • 주변 장치로 값을 출력 할때 사용

몇가지 안되지만 이정도만 알아도 부트로더 코드를 이해하는데는 아무런 문제가 없다. 다음은 이렇게 알아본 어셈블리어 코드를 가지고 책에서 나온 부트로더 코드를 해석해보겠다.

참고 문헌

  1. 64Bit 멀티코어 OS의 구조 - 한승훈 저
This post is licensed under CC BY 4.0 by the author.