Skip to content

3. Machine Level Representation of Programs {CSAPP}


본 장에서는 컴파일러가 만들어낸 어셈블리 언어를 기반으로 다양한 실험을 해볼 것이다. 명령 실행 순서를 어떻게 재정렬 하는지, 재귀호출을 반복문으로 만들어 성능을 향상시킬 수 있을지에 대한 내용을 다룬다. 이젠 굳이 어셈블리 단으로 내려가지 않아도 되는데 굳이 어셈블리쪽 코드를 훔쳐보는 이유는 더 좋은 C 코드를 작성하기 위해서기이도 하며, 멀티 스레드 프로그래밍에서 공유되는 자원과 아닌 것들에 대한 차이를 구별하기 위해서, 어떤 방식으로 악성코드가 메모리 공간을 악의적으로 사용할 수 있는지에 대한 인사이트를 얻기 위해서이다.

INDEX#

  • 3.1 A Historical Perspective
    • 역사적 관점에서의 기계어? 그러면 MIPS부터 시작하나?
  • 3.2 Programming Encodings
    • 인코딩, 디코딩의 개념은 암호화 복호화에 대응될 수도 있고, 압축하기 압축풀기에도 대응될 수 있다. 여기에서 의미하는 인코딩은 무슨 의미일까?
  • 3.3 Data Formats
    • 데이터 구조, struct?
  • ⭐️ ⭐️ 3.4 Accessing Information
    • 80386, IA32, x86-64에 이은 레지스터들의 목록과 그 용도에 대해 다룬다.
    • caller-saved, callee-saved 레지스터들의 차이점을 이해한다.
  • 3.5 Arithmetic and Logical Operations
    • load effective address (leaq) 메모리 값을 바로 참조하지 않음. 복잡한 수식을 여러번 메모리를 참조하지 않고 마치 수학공부할 때 x, y 계수를 조정한 뒤에 한 방에 작업을 수행하는 것과도 같다.
    • unary operation: 단항연산자
    • binary operation: 이항연산자
    • shift operation: 시프트 연산자 with %cl (amount of shift) and %salb, %salw, %sall, %salq
  • 3.6 Control
    • 컨트롤 플로우 = jmp, 함수 호출, goto, 분기, 반복
    • condition flags: 1bit짜리 플래그 레지스터, 정수형 오버플로 여부를 탐지하는 carry flag, 직전 명령어가 0을 리턴했는지를 저장하는 zero flag, 직전 명령어가 음수를 리턴했는지를 저장하는 sign flag, 2의 보수로 나타낸 양수의 마지막 숫자가 음수로 넘어갔는지 여부를 탐지하는 overflow flag
    • set 명령어들: cmp 결과를 특정
    • jmp 명령어:
    • loops
  • ⭐️ 3.7 Procedures
  • 3.9 Heterogeneous Data Structure (이종 데이터구조)
    • 서로다른 데이터구조? 아니었다. struct, union이었다!
  • 3.10 Combining Control and Data in Machine Level Programs
    • 동작과 데이터를 기계수준의 프로그램에서 사용하는 방법
  • 3.11 Floating Point Code
    • 부동소수점
  • 3.12 Summary