본문 바로가기

학부 수업 정리/시스템프로그래밍 (21-2)

[시스템] 4. 어셈블리 기초

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 이 저장되어 있다. 

  1. $\verb|movq (%rdi), %rax|$ : $\verb|%rdi|$ 레지스터가 가리키는 공간에 저장된 값을 $\verb|%rax|$ 레지스터로 옮긴다. $\verb|%rax|$에 123이 대입된다.
  2. $\verb|movq (%rsi), %rdx|$ : $\verb|%rsi|$ 레지스터가 가리키는 공간에 저장된 값을 $\verb|%rdx|$ 레지스터로 옮긴다. $\verb|%rdx|$에 456이 대입된다.
  3. $\verb|movq %rdx, (%rdi)|$ : $\verb|%rdx|$ 레지스터에 저장된 값을 $\verb|%rdi|$ 레지스터가 가리키는 공간으로 옮긴다. $\verb|(%rdi)|$에 456이 대입된다.
  4. $\verb|movq \$rax, (%rsi)|$ : $\verb|%rax|$ 레지스터에 저장된 값을 $\verb|%rsi|$ 레지스터가 가리키는 공간으로 옮긴다. $\verb|(%rax)|$에 123이 대입된다.

 

4. 기타 어셈블리 연산들

  1. $\verb|[addq Src, Dest]|$  :  $\verb|Dest = Dest + Src|$
  2. $\verb|[subq Src, Dest]|$  :  $\verb|Dest = Dest - Src|$
  3. $\verb|[imulq Src, Dest]|$  :  $\verb|Dest = Dest * Src|$
  4. $\verb|[incq Dest]|$  :  $\verb|Dest++|$
  5. $\verb|[decq Dest]|$  :  $\verb|Dest--|$
  6. $\verb|[negq Dest]|$ :  $\verb|Dest = -Dest|$
  7. $\verb|[notg Dest]|$  :  $\verb|Dest = ~Dest|$