Notice
Recent Posts
Recent Comments
Link
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Archives
Today
Total
관리 메뉴

eliwook 님의 블로그

[CSAPP]3.4 정보 접근하기 본문

Jugle/Today I Learned

[CSAPP]3.4 정보 접근하기

eliwook 2024. 7. 29. 23:06

우리는 처음에 16비트의 컴퓨터를 사용했다. 그후 기술의 발달로 32비트 컴퓨터가 등장하게 되었고 지금은 64비트를 사용하고 있다.

이와 맞게 레지스터 또한 발달을 하게 되었고 하위 호환성을 위해서 확장성을 기반으로 발달하게 되었다.

 

역사적으로 큰 변화 기점중 하나인 인텔의 8086 CPU에서 레지스터들은 %ax %sp와 같은 16비트 레지스터를 가지고 있었다.

이전까지는 IA16 아키텍처를 사용하고 있었으나 IA32로 확장을 하면서 레지스터 또한 %eax, %esp로 확장이 되었다.이후 x86-64로 확징이 되면서 레지스터들은 %rax, %rsp까지 64비트로 확징이 되었다. 추가적으로 %r8 ~ %r15의 이름을 가진 레지스터도 추가되었다.

위와같이 레지스터는 구성하게 된다. 이 레지스터들은 “중첩된”구조를 가진다.

 

중첩된 데이터는 서로의 안에 접근을 할 수 있게된다. rax라는 큰 레지스터 안에 eax, ax, al 의 레지스터가 있는것이고 이를 서로 참조할 수 있다.

 

요약을 하자면 기술의 발전에 따라 레지스터도 커지게 되었으나 하위 호환성과 메모리 효율성 때문에 8비트,16비트 32비트 64비트 접근이 가능하다.

3.4.1. 오퍼랜드 식별자

CPU에서 연산을 수행할때 연산을 수행 하는데 데이터나 데이터 주소가 필요한데 이를 오퍼랜드라고 한다.

x86-64는 위와같은 오퍼랜드의 형태를 지원한다. 위의 형태를 통해 레지스터나 메모리로부터 데이터를 읽어올 수 있게된다.

위의 내용에 대해서 간단하게 설명을 하자면 $가 붙으면 상수형 자료형이라는 의미이고 %rax 와 같이 레지스터 이름에 %가 붙게 되면 레지스터의 value(메모리주소)를 return하게 되고 메모리 주소에 소괄호()가 감싸지면 메모리 주소의 값을 return 하게 된다.

연산을 하게 될때 소괄호 안에서 연산을 하게 되는데 필드의 밖과 첫번째 필드, 두번째 필드의값은 서로 더한다는 의미를 가지고 있고 세번째 필드는 두번째 필드와 곱한다라는 의미를 가지고 있다.

예를 들어 3(eax,ebx,5) 라는 의미는 eax+ebx*5+3이라는 의미를 가지고 있다.

3.4.2-3. 데이터 이동 인스트럭션

데이터 이동 인스트럭션은 mov다

연산을 할때 값을 임시로 저장을 해야할때나 값을 복사해야할때 사용하게 된다.

이때 유의를 해야할점은 데이터 크기가 동일한 값일때는 mov를 그대로 사용하면 되지만 크기가 달라질때는 저장할 값의 크기를 바꾸어 줘야한다.

movb, movw, movl, movq 4개의 인스트럭션이며 이는 위에서 전에 소개한 어셈블리어의 자료형태를 따서 mov 뒤에 붙여주게 된다. mov는 두개의 오퍼랜드를 가지게 되며 첫번째 오퍼랜드를 두번째 오퍼랜드에 쓰겠다 라는 형식이 된다.

ex ) mov %dp, %sp 라는 말은 dp의 값을 sp로 옮겨라 라는 말이 된다.

우리는 음수를 선언할때 상수 앞에 ‘-’ 를 붙여서 사용하게 된다. 컴퓨터는 음수의 여부를 첫번째 비트의 값을 0,1로 확인한다. 이때 형변환을 해버리면 첫번째 비트가 사라지게 된다. 이를 유지하기 위해 우리는 movs를 사용해서 커진 값을 1의 보수로 채워서 새로운 값의 상위 값을 1로 만들게 된다. 만약 양수로 선언된 값은 movz를 통해서 상위 비트를 0으로 채운다.

위의 예제를 보면 이해가 쉬울것이다. 4번줄을 보면 mov s를 했기때문에 상위 비트를 1로 채우게 되고 이전의 값인 비트(b)에서 쿼드워드(q)로 형변환을 하겠다는 뜻이 된다.

3.4.4. 스택 데이터의 저장과 추출 (push,pop)

프로그램 스택에 데이터를 Push, Pop 하는데 사용하게 된다.

스택은 top 원소가 모든 원소중 가장 낮은 주소를 갖는 형태이다. 스택은 아래방향으로 성장하는 형태이다. 스택 포인터 %rsp는 스택의 top을 가리키게 된다.

위의 예시를 보면 값을 추가하면 rsp의 값을 감소시키고 값을 pop하면 rsp의 값을 다시 증가시키고 rdx에 pop한 값을 저장한다.

실제로 스택에 값을 pop하면 그 값은 사라지는게 아니다. 단지 top이 가리키고 있지 않아서 아무런 의미가 없는 값이 되버린다.

 

'Jugle > Today I Learned' 카테고리의 다른 글

R-B Tree의 삽입  (0) 2024.08.01
[C언어] Stack 구현 문제 풀이  (0) 2024.07.31
CSAPP Ch 3.3  (2) 2024.07.23
[Day+17] 백준 9084 동전  (0) 2024.07.20
[Day+17] DP(Dynamic Programing)  (0) 2024.07.18