목록CSAPP정리 (6)
혼자 정리
x86-64 CPU는 다음과 같이 64비트 값 저장 가능한 범용 레지스터를 16개 가지고 있다. 맨 앞의 붙은 r은 register의 의미로 64비트를 뜻한다 맨 앞에 e가 있는 경우 32비트를 의미 기본적으로 그림에서 보듯이 인스트럭션은 16개의 레지스터에 있는 여러 크기의 하위 바이트 데이터에 대해 연산할 수 있다. 64비트 연산시 레지스터 전체에, 32비트 연산시 하위 4바이트에, (위 그림에는 없지만) 16비트 연산시 하위 2바이트에, 8비트 연산시 하위 1바이트에 접근. 레지스터에서 1,2,4,8바이트를 사용할 수 있는데 8바이트를 사용하는 경우를 제외하고 전체 레지스터를 사용하지 않는다. 그러한 경우 레지스터의 남는 바이트들에 대해서 다음과 같이 처리한다. 1 or 2바이트 생성 : 나머지 바..
기본적으로 '워드(word)'는 16비트 데이터 타입을 지칭(처음에 16비트 구조를 사용하다 32비트로 확장했기 때문) 32비트는 '더블워드(double-word)' 64비트는 '쿼드워드(quad-word)' 아래 표는 C 기본 데이터 타입에 사용되는 x86-64 표현을 보여줌. 표준 int값은 더블워드로 저장(32비트=4바이트) 포인터는 64비트 머신에서 8바이트 쿼드워드로 저장. x86-64에서 long은 64비트(=8바이트)로 구현 C 선언 인텔 자료형 어셈블리코드 접미문자(suffix;꼬리 문자) 사이즈 (바이트) char Byte b 1 short Word w 2 int Double word l 4 long Quad word q 8 char * Quad..
p1.c와 p2.c의 C프로그램 작성한다고 가정. Unix 커맨드 라인에서 컴파일하려면 다음의 명령어 작성. linux> gcc -Og -o p p1.c p2.c gcc는 GCC C 컴파일러를 지칭. -Og옵션은 원본 코드의 전체 구조를 따르는 정도의 최적화를 하는 수준으로 기계어 코드를 생성한다. 더 높은 수준의 최적화 진행시 기존 C 코드의 전체적 구조를 변형시킬 가능성이 존재. 여기서는 학습을 위해 이 옵션을 사용할 것. GCC가 소스 코드를 실행 가능한 코드로 변환하는 과정은 다음과 같다. C _전처리기(preprocesor)_는 소스 코드 내의 #include나 #define 선언 같은 지시자들의 내용을 소스 코드에 삽입해준다. _컴파일러_가 각각의 소스 파일들의 어셈블리 코드 버전인 p1.s와..
컴퓨터는 기계 코드(machine code)를 실행. (로우레벨 오퍼레이션들을 바이트의 일련으로 인코딩한 것) 컴파일러는 프로그래밍 언어에서 기계코드를 생성. GCC는 기계 코드의 텍스트 버전인 어셈블리 코드를 생성. 그 다음 GCC가 어셈블러와 링커를 불러서 실행 가능한 기계 코드를 생성 이번 단원에서는 기계 코드와 사람이 읽을 수 있는 어셈블리 코드에 대해 살펴볼 것. x86-64 기반의 기계 언어를 볼 것.
2.2 정수의 표시 signed integer와 unsigned integer를 인코딩하는 방법에 대해 살펴볼 것. 또한 인코딩된 정수를 길이가 다른 표현에 맞게 확장 or 축소하는 방법도 볼 것이다. 다음은 정수 인코딩 공부 과정에서 참조 가능한 수학적 용어들에 대한 표이다($\omega$는 데이터 표시에 필요한 비트 수를 의미). Symbol Type Meaning Page(한글판/영문판) $B2T_{\omega}$ Function Binary to two's complement 63/100 $B2U_{\omega}$ Function Binary to unsigned 61/98 $U2B_{\omega}$ Function Unsigned to binary 63/100 $U2T_{\omega}$ Func..
2.1 정보의 저장 기계수준의 프로그램은 메모리를 '가상메모리(virtual memory)'로 부르는 거대한 바이트의 배열로 취급. 메모리의 각 바이트는 주소로 식별할 수 있고, 모든 가능한 주소의 집합을 '가상 주소공간(virtual address space)'이라 부름(이는 기계수준 프로그램에게 제공되는 개념적인 이미지). 2.1.1 16진수 표시 C에서 0x나 0X로 시작하는 숫자 상수는 16진수로 해석. 'A'에서 'F'까지 대소문자 모두, 혼용 여부에 상관없이 16진수 자릿수로 해석(ex. 0xFA1D37B == 0xfa1d37b == 0xFa1D37b) Hex digit 0 1 2 3 4 5 6 7 Decimal value 0 1 2 3 4 5 6 7 Binary value 0000 0001 ..