1. 메모리 주소의 표현 모드
$$\verb|D(Rb, Ri, S) -> Mem[Reg[Rb] + S*Reg[Ri] + D]|$$
왼쪽의 표현식은 오른쪽 공식에 의해 생성되는 숫자로 나타낸다. 이 숫자가 메모리 주소가 된다.
- $\verb|Rb|$ : Base Register 주소 (16개의 정수 레지스터)
- $\verb|Ri|$ : Index Register 주소 (\%rsp 제외한 모든 레지스터)
- $\verb|S|$ : Scale - 1, 2, 4, 8 (Short, int, long 타입 보정용. 디폴트는 1)
- $\verb|D|$ : Constant Displacement - 1, 2, 4 bytes
Expression | Address Computation | Address |
$\texttt{0x8(%rdx)}$ | $\texttt{0xf000 + 0x8}$ | $\texttt{0xf008}$ |
$\texttt{(%rdx, %rcx)}$ | $\texttt{0xf000 + 0x100}$ | $\texttt{0xf100}$ |
$\texttt{(%rdx, %rcx, 4)}$ | $\texttt{0xf000 + 4*0x100}$ | $\texttt{0xf400}$ |
$\texttt{0x80( ,%rdx, 2)}$ | $\texttt{2*0xf000 + 0x80}$ | $\texttt{0x1e080}$ |
2. mov: 데이터 이동
$\verb|movq SOURCE, DEST|$
SOURCE에서 DEST로 값을 옮기는 명령어이다. SOURCE랑 DEST에 올 수 있는 명령어의 타입에는 Immediate, Register, Memory 세 가지가 있다.
- Immediate - $\verb|\$0x400, \$-533|$ : 상수값
- Immediate (상수)는 Dest 자리에 올 수 없다. (상수에다가 저장하는건 상식적으로 불가능)
- Register - $\verb|%rax, %r13|$: 16개의 정수 레지스터 중 하나 (\%rsp 제외)
- Memory - $\verb|(%rax)|$ : 레지스터에 의해 주어진 주소가 가리키는 메모리 공간
- Memory는 Source와 Dest 중 한 곳에만 올 수 있다. 즉, Memory에서 Memory로의 movq 연산은 불가능하다.
3. swap 함수의 분석 예제
voic swap(long *xp, long *yp) {
long t0 = *xp; // movq (%rdi), %rax
long t1 = *yp; // movq (%rsi), %rdx
*xp = t1; // movq %rdx, (%rdi)
*yp = t0; // movq $rax, (%rsi)
}
$\verb|(%rdi), (%rsi)|$ 는 Memory 타입으로 $\verb|%rdi, %rsi|$ 레지스터에 저장된 주소가 가리키는 메모리 영역을 나타낸다. $\verb|%rax, %rdx|$ 는 Register 타입으로 이 공간에 직접 숫자를 저장하게 된다. $\verb|%rdi|$에는 주소 $\verb|0x120|$ (xp 주소) 가 저장되어 있고, 해당 주소가 가리키는 메모리 영역에는 123 이 저장되어 있다. $\verb|%rsi|$에는 주소 $\verb|0x100|$ (yp 주소)가 저장되어 있고, 해당 주소가 가리키는 메모리 영역에는 456 이 저장되어 있다.
- $\verb|movq (%rdi), %rax|$ : $\verb|%rdi|$ 레지스터가 가리키는 공간에 저장된 값을 $\verb|%rax|$ 레지스터로 옮긴다. $\verb|%rax|$에 123이 대입된다.
- $\verb|movq (%rsi), %rdx|$ : $\verb|%rsi|$ 레지스터가 가리키는 공간에 저장된 값을 $\verb|%rdx|$ 레지스터로 옮긴다. $\verb|%rdx|$에 456이 대입된다.
- $\verb|movq %rdx, (%rdi)|$ : $\verb|%rdx|$ 레지스터에 저장된 값을 $\verb|%rdi|$ 레지스터가 가리키는 공간으로 옮긴다. $\verb|(%rdi)|$에 456이 대입된다.
- $\verb|movq \$rax, (%rsi)|$ : $\verb|%rax|$ 레지스터에 저장된 값을 $\verb|%rsi|$ 레지스터가 가리키는 공간으로 옮긴다. $\verb|(%rax)|$에 123이 대입된다.
4. 기타 어셈블리 연산들
- $\verb|[addq Src, Dest]|$ : $\verb|Dest = Dest + Src|$
- $\verb|[subq Src, Dest]|$ : $\verb|Dest = Dest - Src|$
- $\verb|[imulq Src, Dest]|$ : $\verb|Dest = Dest * Src|$
- $\verb|[incq Dest]|$ : $\verb|Dest++|$
- $\verb|[decq Dest]|$ : $\verb|Dest--|$
- $\verb|[negq Dest]|$ : $\verb|Dest = -Dest|$
- $\verb|[notg Dest]|$ : $\verb|Dest = ~Dest|$
'학부 수업 정리 > 시스템프로그래밍 (21-2)' 카테고리의 다른 글
[시스템] 6. IPC (Inter Process Communication) (0) | 2021.12.28 |
---|---|
[시스템] 5. Race Condition & Signal Blocking (0) | 2021.12.28 |
[시스템] 3. Signal 프로그래밍 (0) | 2021.12.28 |
[시스템] 2. 멀티 프로세스 프로그래밍 (0) | 2021.12.28 |
[시스템] 1. Processes - 생성과 삭제 (0) | 2021.12.28 |