4.1 The Y86-64 Instruction Set Architecutre 4.1.1 Programmer-Visible State Y86-64의 각 명령어들은 프로세서 상태의 어떤 부분을 읽고 수정할 수 있다. 프로그래머에게 보여지는 상태(programmer-visible state)라고 하며, 프로그래머는 어셈블리 코드로 프로그램을 작성할 수 있고 기계 수준의 코드를 생성하는 컴파일러를 작성할 수 있다. 15개의 프로그램 레지스터가 있다. (%rax, %rax, %rcx, %rdx, %rbx, %rsp, %rbp, %rsi, %rdi, and %r8 through %r14) 각 레지스터들은 64비트 word를 저장한다. 레지스터 %rsp는 push, pop, call, return 명령어를 이용하여..
3.10 Combining Control and Data in Machine-Level Programs 어떻게 기계 수준의 코드가 프로그램의 제어 측면을 구현하는 지와 어떻게 자료 구조로 구현되는지 구별하여 보았다. 데이터와 제어가 서로 상호작용하는 방법을 알아보자 3.10.1 Understanding Pointers 포인터는 C언어에서 중심적인 특징이다. 자료 구조에 있는 요소에 대한 참조를 생성하는 통합된 방법을 제공한다. 다음은 포인터의 중요한 원칙과 기계 코드로 매핑하는 것이다. - 모든 포인터는 연관된 타입이 있다 : 포인터가 어떤 오브젝트를 가리키는지 가리킨다. - 모든 포인터는 값이 있다 : 값은 지정된 타입의 어떤 오브젝트의 주소이다. NULL 값은 어떠한 곳도 가리키지 않는 것을 뜻한다...
3.7 Procedures 프로시저는 소프트웨어에서 중요한 추상화이다. 프로시저는 인수와 반환 값의 지정된 집합을 가진 기능들을 구현한 코드를 패키징하는 방법을 제공한다. 잘 설계된 소프트웨어는 프로시저를 추상화 메카니즘으로 사용하며, 상세한 구현은 숨기며 어떤 값이 계산되고 프로시저가 프로그램 상태에 어떤 영향 있는 지에 대한 명확한 정의는 제공한다. 프로시저는 프로그래밍 언어에서 많은 모습으로 보여진다. - 함수, 메소드, 서브루틴, 핸들러 등 프로시저에 대한 기계 수준을 제공할 때 많은 속성들이 있다 프로시저 P가 프로시저 Q를 호출하고, Q가 실행되고 P로 다시 반환된다. - Passing Control : PC는 Q의 코드의 시작 주소로 설정되고 Q를 호출한 후에 P의 명령어로 설정한다. - P..
3.4 Accessing Information x86-64 중앙처리장치(CPU)는 64-비트 값을 저장하는 16개의 범용(general-purpose) 레지스터를 포함한다. 이 레지스터들은 정수 데이터와 포인터를 저장한다. 레지스터들의 이름은 %r로 시작하고 뒤에는 다른 이름들을 가지고 있다. 명령어는 16개 레지스터의 낮은 정렬에 있는 바이트에 저장되어 있는 다른 사이즈의 데이터에 대해 연산한다. 바이트 수준 연산은 최하위 비트에 접근한다. (16-비트 연산은 최하위 2바이트, 32비트는 4비트, 64-비트는 모든 레지스터에 접근한다.) 다른 레지스터들은 프로그램에서 다른 역할을 제공한다. 가장 유일한 것은 스택 포인터(stack pointer)로 %rsp이며, 런타임 스택에서 마지막 위치를 가리키는 ..
3.1 A Historical Perspective x86이라고 불리는 Intel 프로세서 라인은 긴 발전적인 개발이 있었다. 높은 성능과 더 발전된 운영체제를 지원하기 위한 요구에 맞게 기술적인 향상에 이점을 띄었다. Intel의 프로세서는 8086 -> Pentium -> Core i7 등으로 발전하였다. Intel은 그들의 프로세서 라인에 다양한 이름을 갖고 있다. Intel Architecture 32-bit의 IA32이고 최근에는 Intel64로 x86-64로 불리고 있다. 많은 회사들이 인텔 프로세서와 호환 가능한 프로세서들을 생산하였다. 이 중의 최고는 AMD(Advanced Micro Devices)이며 늘 Intel에 기술적으로 뒤쳐졌으며 시장 점유율에서도 밀렸다. (최근에는 AMD가 엄..
2.4 Floating Point 부동 소수점(Floating Point) 표현법은 유리수를 인코딩하는 방법이다. x × 2^y 의 형태 어떻게 숫자가 IEEE 부동 소수점 표현 방식으로 표현되는 지 보자. 2.4.1 Fractional Binary Numbers 부동 소수점 수를 이해하는 첫 번째 단계는 분수값을 가지는 이진수를 고려해야 한다. '.' 은 이진 포인트(binary point) 이며 왼쪽에 비트는 2의 거듭 제곱의 값을 갖고 오른쪽은 2의 음수 거듭 제곱의 값을 갖는다. 이진 포인트를 오른쪽으로 하나 시프트하면 2를 곱하는 값의 효과를 얻는다. 유한한 길이의 인코딩으로 고려하면 1/3이나 5/7과 같은 수를 정확하게 표현할 수 없다. 1/5 같은 경우 십진 소수로 나타내면 정확히 0.02..
2.2 Integer Representations 정수를 인코딩하는 두가지 다른 방법이 있다. 하나는 부호가 없는 수, 다른 하나는 음수, 0, 양수를 표현하는 것이다. 위의 표는 어떻게 컴퓨터가 정수를 인코딩하고 연산하는 지에 대한 수학적 용어이다. 2.2.1 Integral Data Types C는 다양한 정수형 데이터 타입을 지원하며 유한한 범위의 정수를 표현한다. 다른 사이즈에 맞게 할당되는 바이트 수는 프로그램이 32비트나 64비트로 컴파일 되는지에 따라 다르게 한다. 고정 사이즈 데이터 타입을 제외하고는, 양수와 음수에 대한 대칭 범위를 요구한다. 2.2.2 Unsigned Encoding w 비트의 정수형 데이터 타입이 있다. 이진법으로 표현할 때 각 비트의 부호가 없다는 것을 포함한다. 각..
2.1 Information Storage 대부분의 컴퓨터는 메모리의 개별 비트를 접근하기 보다는 8비트, 혹은 바이트(byte) 단위로 접근한다. 기계 수준(machine-level) 프로그램은 (가상) 메모리를매우 큰 바이트 배열로 본다. 메모리의 모든 바이트는 주소(address)라고 불리는 유일한 번호로 식별되고, 주소들의 집합을 가상 주소 공간이라고 한다. 어떻게 컴파일러와 런타임 시스템이 다른 프로그램 오브젝트를 저장하는 메모리 공간을 관리할 수 있는 단위로 나눌 수 있는 가를 공부한다. 2.1.1 Hexadecimal Notation 한 단일 바이트는 8비트이다. 이진수로 00000000 ~ 11111111의 범위를 갖는다. (Decimal : 0 ~ 255) 이진수는 장황하고 복잡하기 때..
1.7 The Operating System Manages the Hardware hello 프로그램 예시에서, 쉘이 hello 프로그램을 로드하고 실행하고, hello 프로그램이 화면에 출력되면, 프로그램은 키보드, 화면, 디스크 또는 메인 메모리에 직접적으로 접근하지 않는다. 대신에 그들은 운영체제(operating system)에 의해 제공되는 서비스에 의존한다. 우리는 운영체제를 응용 프로그램과 하드웨어 사이에 있는 소프트웨어로 생각한다. 응용 프로그램에 의해 하드웨어를 조작(manipulate)를 하려는 모든 시도들은 운영체제를 거친다. 운영체제는 두 가지 기본적인 목적이 있다: 1. 애플리케이션에 의해 잘못된 사용으로부터 하드웨어 보호 2. 복잡하고 다양하게 다른 저수준 하드웨어 장치에 대한 ..
1.4 Processors Read and Interpret Instructions Strored in Memory 1.4.1 Hardware Organization Of a System hello 프로그램을 실행시킬 때 어떤 일이 벌어지는 지 알려면 시스템의 하드웨어 구조를 이해해야 한다. Buses 시스템 전체를 실행하는 것은 버스(Bus)라고 불리는 일종의 도관의 모음이다. 버스는 각 구성 요소 간의 바이트를 전달시키면 워드(word)라고 불리는 고정된 사이즈의 바이트 모음을 전달시킨다. word에 바이트 수는 근본적인 시스템 매개변수이다. 오늘날 대부분 기계들은 4바이트(32비트) or 8바이트(64비트)로 이루어져있다. I/O Devices I/O(입출력) 장치는 외부 세계와 연결하는 시스템 e..