시스템 프로그래밍 노트 3 - 어셈블리의 기본

2019년 10월 22일

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

1. 기본 용어

2. C 코드의 변환 과정

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

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

gcc -Og -S sum.c

3. x86-64 정수 레지스터

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

4. Operand Types

5. Memory Addressing Modes

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

6. 기초 Instructions

6.1. movq

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

6.2. leaq

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

6.3. Arithematic Operations

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