컴퓨터 구조 CS:APP 3장 - 2 -
오퍼랜드 식별자
대부분의 인스트럭션은 하나 이상의 오퍼랜드를 가진다
오퍼랜드는 연산을 수행할 입력값과 그 결과를 저장할 목적지의 위치를 명시한다
오퍼랜드의 종류는 세 가지 타입으로 구분할 수 있다
- immediate - 상수 값(하드코딩된 상수)
- register - 레지스터의 저장된 데이터
- memory reference - 연산에 사용되는 값이 메모리 어딘가에 저장된 값, 그 위치는 유효 주소(effective address) 계산을 통해 결정
주소 = base + (index × scale) + offset s = 배율인자
s가 1, 2, 4, 8인 이유 = char, short, int, float, long, double 등 범위 내에서 결정되기 때문
데이터 이동 인스트럭션
mov 계열 - 해당 계열은 데이터를 변형 없이 복사, 명령어 이름은 복사할 데이터의 크기에 따라 접미사가 붙음
- movb = 바이트 복사
- movw = 워드 복사
- movl = 더블 워드 복사
- movq = 쿼드 워드 복사
소스 오퍼랜드 - 상수, 레지스터 저장 값, 메모리 저장 값을 표시한다
목적 오퍼랜드 - 레지스터, 메모리 주소의 위치를 지정한다
x86-64 - 데이터 이동 인스트럭션에서 두 개의 오퍼랜드 모두가 메모리 위치에 올 수 없도록 제한
movl이 레지스터를 목적지로 쓰는 경우 - 레지스터의 상위 4바이트도 0으로 설정
movq - 32비트 2의 보수 숫자로 나타낼 수 있는 상수 소스 오퍼랜드들만을 갖는다
movabsq - 임의의 64비트 상수 값을 소스 오퍼랜드로 가질 수 있으며, 목적지로는 레지스터만을 가질 수 있다
movz - 목적지의 남은 바이트들을 모두 0으로 채운다
movs - 가장 중요한 비트를 반복해서 복사하는 부호 확장으로 채운다
exchange의 인스트럭션
-
두 개의 데이터 이동(movq)
-
함수가 호출된 위치로 리턴하는 인스트럭션(ret)
리턴 값을 레지스터 %rax에 저장해서 리턴하거나, 레지스터의 하위 부분 중의 하나로 리턴한다
이 코드의 두 가지 특징
-
C언어에서 포인터는 어셈블리어에서 단순히 주소라는 점
-
포인터를 역참조하는 것은 포인터 값을 레지스터에 넣은 뒤, 이를 메모리 주소로 참조하는 방식이다
스택 데이터의 저장과 추출
- 스택에서 값을 꺼내 %rax에 저장
스택 포인터를 8 증가 (pop 연산 효과)
- 스택 포인터를 8 감소 (스택 공간 확보)
현재 %rbp 값을 스택에 저장
스택에 데이터를 저장(push)하거나 스택에서 데이터를 추출(pop)하기 위해 사용한다
스택은 값들이 후입선출 형태로만 추가되거나 제거되는 자료구조이다
쿼드워드 값을 스택에 추가하려면, 스택 포인터를 8 감소시키고, 그 값을 스택 주소의 새로운 탑에 기록하는 것으로 구현된다