시스템 프로그래밍 노트 3 - 어셈블리의 기본
이 강의에서는 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