4장에 돌입함으로써, 현대 CPU의 핵심인 파이프라이닝이 왜 필요한지와 어떻게 성능을 극대화 하는지를 알아본다. 5장도 동시에 하고 있는데, 진짜 이렇게까지 해야 1KB씩 줄이는구나라는 마음에 보다 램 용량 걱정을 덜 하는 시대에 태어난 것은 다행이라고 생각한다.x86-64를 단순화 한 Y86-64 명령어 집합(ISA)를 살펴보자. 수십 년에 걸쳐 기능이 추가된 x86-64와 달리 교육용 모델 엔진을 사용하는 개념이다.데이터 이동 (Move):irmovq: immediate → register (상수 값을 레지스터로)rrmovq: register → register (레지스터 간 이동)mrmovq: memory → register (메모리에서 레지스터로)rmmovq: register → memory (레..
어셈블리어를 알아두는건 정말정말 실제로 열어볼까 말까겠지만 이런 단계가 기저에 있다는 것을 알아두는 것은 도움이 된다고 한다. 현재의 개발 형태들이 보다 저급을 추구하는 형태의 고점이 C라는건 맞는데 요즘 돈 버는 서비스들이 거기까지 가는지 정말 궁금하다.그럼 오고가는 명령어인 mov에 대해 알아보자. mov + 8바이트인 movq는 3가지 채널을 활용 할 수 있다.즉시 값을 레지스터에 부여하기 : movq $0x123, %rax$는 온전히 그 숫자 값을 말한다.숫자 0x123을 %rax에 넣는다.레지스터의 값을 레지스터에 부여하기 : movq %rdi, %rax%rdi의 값을 %rax에 넣기메모리의 값을 레지스터에 부여하기 : movq (%rdi), %rax()는 메모리 주소를 뜻한다.%rdi 내..
1장에서 어셈블리어로 구성된 소스 파일이 만들어지는 일련의 과정을 보았던 적이 있었다. 우리는 이 글에서 3장을 다룰 것인데, 보다 상세하게 이 부분을 다시 다룬다. 정리하고 있으면 글을 어디서 끊는게 딱 좋은지 고민이 많다.어셈블리어어셈블리 코드는 기계어로 전환되기 직전 상태의 소스 파일 내의 구성이다. C 언어 코드는 여러 단계의 변환을 거쳐 어셈블리 코드로 전환되고, 마지막에 기계어로 전환된다. 이 어셈블리 코드는 변수 조작을 레지스터라는 CPU 내의 정말 작고 정말 빠른 저장공간을 활용한다.여러가지 레지스터가 있지만, 가장 중요한 범용 레지스터들을 알아두면 좋다.%rax : 보통 함수의 반환 값을 저장하는 용도로 사용된다.%rdi, %rsi, %rdx, %rcx, %r8, %r9 : 함수에 인자를..
다룬다고 생각은 해도 참 와닿지 않는 두 주제이다. 어쨌든 2장에서 다루는 것도 있지만 이후의 내용들에서도 나올 수 있는 만큼 책을 읽어 내려가는데 있어 나름의 배경지식이라고 여기는 것도 좋은 학습 자세라고 생각한다. 2장의 핵심 내용은 여기서 마무리 된다고..부동소수점 수1,230,000은 1.23 * 10^6과 같다 그치? 이걸 그대로 컴퓨터에 적용하게 된다.부동소수점이라 불리는 float는 32비트 = 4바이트로 구성되어있다 :1비트는 부호. 숫자의 음수 여부를 결정한다. boolean isMinus8비트는 지수. 소수점의 위치를 결정한다. 2^x에서 x를 맡는다23비트는 가수. 실제 숫자 부분을 나타낸다. 앞의 예제에서, 1.23을 말한다부동소수점은 이 셋의 구성을 합쳐서 표현한다. 그리고 부동은..
CSAPP의 2장의 초반부를 알아보는 시간이다. 이번 내용은 의외로 대학 1학년 과목이랑 비슷한 난이도 수준인데, 꼬아서 내면 대응이 쉽진 않을 것 같다. 이런거까지 이해해줘야하는 컴퓨터를 받아줘야 또 나중에 LLM도 잘 쓰고 MCP도 잘쓰지 않을까?컴퓨터는 0과 1로 모든걸 표현한다는데 16진수 같은거 왜 있나요?;2의 4승이니, 1010을 "A"로 바꾸듯 같은 길이라면 더 많은 내용을 담을 수 있다.사람의 10진수에 알파벳을 붙였어서 10진수의 Extension Pack 같은 것이다. 보다보면 보인다 보여!가 가능해진다. 10진수에 알파벳 들어가는게 됐으면 아주 32진수도 하지 그랬어요. 0 - 9에 A - Z도 다 들어가네?umm.. 2^5니까 5비트씩 묶어서 표현해야한다. (16진수가 4비트 단위..