1 minute read

이 강의에서는 64비트 아키텍쳐만 커버한다.

1. 기본 용어

  • 아키텍쳐 : 어셈블리/기계어를 읽거나 쓸 때 필요한 프로세서 디자인의 일부
  • 마이크로 아키텍쳐 : 하드웨어의 운영에 대한 기술
  • 기계 코드 : 프로세서가 실행하는 프로그램 그 자체
  • 어셈블리 코드 : 기계어의 글자 표현text representation

2. C 코드의 변환 과정

C 프로그램은 컴파일러에 의해 어셈블리 프로그램으로 변환되고, 어셈블리 프로그램은 어셈블러에 의해 binary Object 프로그램으로 변환된다. 마지막으로 Linker를 통해 정적 라이브러리를 사용할 수 있게 만들어 실행 가능한 프로그램executable program이 된다(printf과 같은 라이브러리 함수나 다른 파일의 referencing).

즉, C 코드를 어셈블리 코드로 변환하려면 c 컴파일러만 실행해야 하고, 이는 gcc가 지원한다.

gcc -Og -S sum.c

3. x86-64 정수 레지스터

기본적으로 각 정수 레지스터에는 8바이트의 공간이 할당된다.

  • %rax, %rcx, %rdx, %rbx, %rsi, %rdi, %rsp, %rbp
    • r 대신에 e를 사용하면 하위 4바이트에 접근 가능하다.
    • prefix를 사용하지 않으면 하위 2바이트에 접근 가능하다.
    • a/b/c/dx의 경우 %ax = %ah : %al 식의 접근이 가능하다. (각 1바이트)
  • rsi, rdi, rsp, rbp의 경우 sil, dil, spl, bpl식의 하위 1바이트 접근이 가능하다.

  • %r8, %r9, %r10, %r11, %r12, %r13, %r14, %r15
    • 뒤에 d를 붙이면 하위 4바이트에 접근 가능하다.
    • 뒤에 b를 붙이면 하위 1바이트에 접근 가능하다.

4. Operand Types

  • Immediate : 상수 정수. $0x400, $-533 이런 식으로 접근한다.
  • Register : 위에서 기술한 16개의 정수 레지스터들
  • Memory : 레지스터에 의해 주어진 주소가 메모리의 8개의 연속적인 바이트에 대응된다. (%rax)과 같이 접근한다.

5. Memory Addressing Modes

D(Rb,Ri, S) = Mem[Reg[RB] + S*Reg[Ri] + D]

  • D: Constant displacement
  • Rb: Base Register
  • Ri: index Register
  • S: Scale

6. 기초 Instructions

6.1. movq

movq Source, Dest;를 통해 데이터를 이동시킨다.

  • 메모리를 메모리로 옮기거나 어떤 값을 상수로 옮기는 것을 제외한 모든 경우가 가능하다.

6.2. leaq

leaq Src, Dst는 메모리 reference 없이 Src 자체를 Dst의 값에 넣는다.

6.3. Arithematic Operations

Format Computation
addq Src, Dest Dest = Dest + Src
subq Src, Dest Dest = Dest - Src
imulq Src, Dest Dest = Dest * Src
salq Src, Dest (= shlq Src, Dest) Dest = Dest « Src
sarq Src, Dest Dest = Dest » Src (Arithmetic)
shrq Src, Dest Dest = Dest » Src (Logical)
orq Src, Dest Dest = Dest ^ Src
andq Src, Dest Dest = Dest & Src
orq Src, Dest Dest = Dest | Src
incq Dest Dest = Dest + 1
decq Dest Dest = Dest - 1
negq Dest Dest = -Dest
notq Dest Dest = ~Dest

Leave a comment