Computer Science
[CSAPP] 3.5 Arithmetic and Logical Operations(산술연자와 논리연산)
학습 주제 arithmetic 그리고 logical 연산자들에 대해 살펴볼 것이다. 정리한 내용 개요 instruction classes operand size에 따라 다양한 variation을 가질 수 있기 때문에 operation들은 instruction class로 제공된다. instruction class ADD : addb, addw, addl, addq 이제 살펴볼 것 여러가지 operation을 봐볼 것이다. 이는 4개로 group지을 수 있다. load effective address unary binary shift 3.5.1 Load Effective Address memory에서 register로 읽어들이는 명령어의 형태를 가진다. (단, 이 때 메모리에서의 reference는 없다...
[CSAPP] 3.4 Accessing Information(정보 접근하기)
3.4 Accessing Information(정보 접근하기) 레지스터는 8개의 16-bit길이로 시작하여, x86-64로 확장하면서 16개의 64-bit길이까지 확장되었다. 그림에서 알 수 있듯, 16-bit연산은 최하위 2바이트에 대해 연산을 할 수 있고, 32-bit연산은 최하위 4바이트에 대해 연산을 할 수 있고, 64-bit 연산은 레지스터 전체에 접근할 수 있다. 3.4.1 Operand Specifiers 대부분의 명령어는 하나 이상의 오퍼랜드를 가진다. 또한 오퍼랜드는 연산을 수행하는 소스 값과 그 결과를 저장할 위치를 갖고 있다. 오퍼랜드는 세 가지 타입으로 구분할 수 있다. immediate - 상수값, [‘$’ + 정수] 형식으로 나타낸다. (ex) ‘$0x1F’ ) register ..
[CSAPP] 3.3 Data Formats(데이터의 형식)
3.3 Data Formats(데이터의 형식) 인텔은 16-bit 아키텍쳐를 기반으로 32-bit로 확장했기 때문에, “word”라는 용어를 16-bit 데이터 타입에 붙인다. 따라서 32-bit는 “double words”, 64-bit는 “quad words”라 한다. 앞서 말한 오퍼랜드의 크기를 나타내는 접미사 ‘q’는 ‘quad word’를 나타낸다. 이에 따라 대부분의 명령어에는 네 개의 유형이 존재한다. 크기 순서대로 movb, movw, movl, movq이다. 이때, ‘l’을 사용하는 이유는 double word가 long word로 여겨지기 때문이다. ‘l’은 double precision(더블 정밀도)수를 나타내기 위해서도 사용하지만, 부동소수점의 경우에는 완전히 다른 명령어와 레지스터..
[CSAPP] 3.2 Program Encoding(프로그램의 인코딩)
3.2 Program Encoding(프로그램의 인코딩) optimization(최적화) $gcc -Og -o p p1.c p2.c 💡 -Og ~ -O3 : 최적화 수준을 지정, 높을 수록 더 높은 최적화 최적화 수준을 올리면 프로그램은 더 빨리 동작한다. but, 컴파일 시간이 증가하고 디버깅 도구를 실행하기 어려워진다. 또한, 코드가 많이 변경되어 본래의 코드와 기계어 코드 간의 관계를 파악하기에 어려워진다. gcc 동작 과정 전처리 과정 : 전처리기에 의해 .i 파일 생성 ⇒ #include로 명시된 헤더 파일 삽입 → #define으로 선언된 매크로 치환 컴파일 과정 : C 컴파일러를 통해.s 파일 생성 어셈블 과정 : 어셈블러에 의해서 .o (기계어 코드) 파일 생성 링킹 과정 : 링커를 통해서..
[CSAPP] 3.1 A Historical Perspective(역사적 관점)
3.1 A Historical Perspective(역사적 관점) 💡 x86 프로세서의 발전 최초의 single-chip 16비트 마이크로프로세서로 출발하였지만, 초기에는 반도체 기술의 부족으로 여러 가지 면에서 타협을 하다가 점점 성장하게 됨 프로세서 구현에 소요된 트랜지스터의 수 “K” → 1,000 (10^3) “M” → 1,000,000 (10^6) “G” → 1,000,000,000 (10^9). 8086 (1978, 29 K transistors) 최초의 single-chip 16비트 마이크로프로세서. 8088은 8086과 거의 동일하지만 원가 절감을 위해 external bus가 8비트로 제한되었고, IBM 개인 컴퓨터에 사용 됨. 초기 모델은 32Kb의 메모리를 사용했고, 두 개의 flop..