스택은 사실 아래로 자란다(push,pop) - CS:APP 3.4.4
·
CS:APP
후입선출(LIFO: Last-In, First-Out) 자료 구조x86-64 아키텍처에선 주소가 높은 곳에서 낮은 곳으로 자람스택의 꼭대기는 항상 %rsp 레지스터가 가리킴%rsp는 push할 때 내려가고, pop할 때 올라감명령어 요약명령어동작 설명pushq S%rsp -= 8, M[%rsp] = Spopq DD = M[%rsp], %rsp += 8- q는 quad-word, 즉 8바이트- 모든 연산은 8바이트 정렬을 따름📍 pushq %rax 실행 전%rsp = 0x108[0x108] ↑ (아직 안 쓴 공간)📍 pushq %rax 실행 후%rsp = 0x100[0x100] = %rax의 값📍 popq %rbx 실행 후%rsp = 0x108[0x100] = (0x123 등, 값은 여전히 남아 있..
mov 인스트럭션 - CS:APP 3.4.2
·
CS:APP
메모리 ↔ 레지스터 ↔ 즉시값(상수) 간 데이터를 복사하는 명령어모든 조작의 기본 단위기본 형태mov[b|w|l|q] S, D ; D S : Source operand (어디서 가져올지)D : Destination operand (어디다 저장할지)가능한 조합S → D허용 여부예시의미Immediate → Register✅movl $0x10, %eax%eax(32bit)에 0x10을 넣음Immediate → Memory✅movb $-1, (%esp)메모리 주소(%esp)에 1byte(4bit) -1을 저장Register → Register✅movq %rax, %rbx%rax값을 %rbx에 복사 8bytes(64bit)Register → Memory✅movq %rax, -12(%rbp)%rax값을 메모리 주소..
오퍼랜드 식별자(operand specifier 어셈블리의 시작과 끝 - CS:APP 3.4.1
·
CS:APP
오퍼랜드 식별자란?어셈블리에서 “이 데이터 어디서 가져올거야?”를 명시하는 방식즉, 값의 출처(location of data) 를 어떻게 지정하느냐임오퍼랜드의 종류구분예시해석핵심 특징Immediate$0x10상수 16값 그 자체Register%rax레지스터 rax에 저장된 값가장 빠름, 가장 흔함Memory8(%rbp)rbp+8 위치의 메모리 값간접 참조, 주소 계산 포함Immediate(즉시값) 타입 ($value)movq $5, %rax ; rax에 5 저장$5 : 숫자 그 자체앞에 $는 “뒤에 오는 것이 주소가 아닌 값” 이라는 선언C로 따지면 x = 5; 같은 느낌movq $0x10, %rax ;rax에 0x10을 저장메모리에서 가져오는게 아닌, 명령어 내부에서 즉시 가져옴CPU는 값을 해석할 필..
레지스터가 뭔데 - CS:APP 3.4
·
CS:APP
이거 아니다C 코드가 변수, 포인터, 배열 등 사용할 때실제 어셈블리에서는 어떻게 데이터에 접근하는지개요CPU에는 16개의 64비트 범용 레지스터가 있음레지스터는 포인터, 정수, 인자, 지역변수 등을 담는다한 레지스터는 다양한 크기로 쪼개서 접근이 가능(%rax, %eax, %ax, %al)어떤 명령어들은 8바이트 전부를 쓰고, 어떤 명령어는 일부만 씀그 일부만 쓸 때 상위 바이트들이 어떻게 처리되는지가 중요Caller, Callee saved 레지스터가 7종 더 있으나 이 9가지를 외우자참고레지스터 뷰 계열의 차이전통 계열 (8086 때 부터 존재)%ax, %bx, %cx, %dx 계열하위 8비트 : %al, %bl, %cl, %dl특징 : 레거시 구조, OS/컴파일러 호환성 높음64비트 확장 계열 (..
GCC는 C를 어떻게 기계어로 짜깁기할까? - CS:APP 3.2 요약과 인사이트
·
CS:APP
사람이 작성한 고급 언어(C)의 소스코드를 GCC C 컴파일러는 어셈블리 코드 로 만들고, 어셈블러와 링커를 통해 기계어 코드를 생성한다.고급 언어의 높은 수준의 추상화로 인하여, 밑단에서 일어나는 동작들을 알 수 없다.그래서 개발자들은 어셈블리어를 이해하고 활용해야하는데, 그 이유는 다음과 같다최적화 성능 확인 및 튜닝 : 작성한 코드의 컴파일러를 통해 어셈블리 코드를 확인하고, 컴파일러의 성능 및 소스코드의 효율성 분석 및 소스코드의 변경을 통한 성능 극대화보안 취약점 분석 : 런타임 제어 정보 저장방식 약점을 활용한 버퍼 오버플로우 같은 공격에 대한 보호3.2 프로그램의 인코딩linux> gcc -Og -o p p1.c p2.c코드 설명-Og : 최적화 수준 지정 (학습목적 상 더 높은 최적화 적용..
캐시와 저장장치의 상관관계
·
CS:APP
1.5 캐시가 중요하다캐시 메모리(캐시)는 프로세서-메모리 간 격차에 대응하는 방식으로, 프로세서가 단기간에 필요로 할 가능성이 높은 정보를 임시적으로 저장하기 위해 고안.이는 SRAM (Static Random Access Memory) 라는 하드웨어 기술을 이용해 구현했다.프로그램이 가지고있는 지역성 (locality)를 활용하여 시스템이 매우 크고 빠른 메모리 효과를 얻게 하였는데, 자주 액세스할 가능성이 높은 데이터를 캐시가 보관하도록 설정하여 대부분의 메모리 작업을 수행할 수 있게 한다.프로세서-메모리 격차 발생 이유속도 발전의 비대칭성: 프로세서는 기술 발전에 따라 빠른 연산 속도를 가지지만(클럭 속도, 효율적인 파이프라인 등), 메모리는 물리적 한계와 설계상의 제약으로 상대적으로 더디게 발전..