CSAPP
프로세서
데이터 전송 | 대부분의 데이터 전달은 레지스터를 통해서 일어난다. (rax, rsi, r8 등등) 레지스터에 저장되는 값을 프로시저에서 다시 호출해 데이터를 전달하는 형식. 함수가 여섯개 이상의 정수형 인자를 가질 때, 다른 인자들은 스택으로 전달된다. (인자를 저장하는 영역이 따로 있음) |
스택에서의 지역 저장 공간 | 지역 데이터가 스택 내부 Local variables에 저장되는 경우는 다음과 같다. 지역 변수의 수가 레지스터보다 더 많을때, 지역변수의 &연산자가 사용되어, 변수의 주소를 생성해야 할 때, 배열 또는 구조체일때 |
레지스터를 이용하는 지역저장소 | 프로그램 레지스터들은 모든 프로시저들이 공유함 피호출자 레지스터는 호출자가 나중에 사용할 경우를 고려해서 레지스터 값을 덮어쓰지 않고, 피호출자 레지스터에 해당 값을 저장한다. 이는 재귀 프로시저를 설명하며 덧붙이겠다. 리턴하기 전에 스택에서 값을 팝 해오는 방식으로 레지스터를 보존. |
재귀 프로시저 | 재귀는 프로시저가 리턴 조건에 만족할때까지 프로시저를 호출하는 방식이다. 팩토리얼, 피보나치 수를 구하는 코드가 다음에 해당함. 운영 방식은 프로시저가 호출될 때 지역 저장소를 할당, 리턴하기 전에 이것을 반환하는 방식 쉽게 생각하면 프로시저 아래 프로시저가 계속해서 추가되는 형식 이때 결과값에 대한 연산을 실행하기 위해 피호출자, 저장 레지스터를 이용해서 기존 레지스터의 값을 덮어씌우는 것이 아닌 피호출자, 저장 레지스터에 임시로 값을 저장해서 인자로 전달하곤 한다. 마치 버블정렬의 tmp를 보는듯 함 |
배열의 할당과 접근
배열이란? | 같은 자료형의 연속으로 보다 큰 데이터를 연계시켜 저장할 수 있음 |
기본 원리 | 사실상 위의 공식만 다 외우면 배열에 접근하는 법은 다 알 수 있다. 메모리의 시작주소 + 자료형의 크기*번지수, 이렇게 생각하고 접근하면 생각보다 그렇게 어렵지 않다. & 연산자 같은 경우 주소값을 저장해야 함으로 leaq 연산자를 사용해서 접근하면 되고, 포인터같은 경우는 결국 해당 메모리의 값에 접근하는 거니깐 다른 수식과 크게 다르지 않다. 다른 점이라곤 포인터의 기본 크기가 8Byte를 잡아먹는다는것 |
고정 크기의 배열 | C 컴파일러로 위 코드를 최적화한 모습. 고정 길이 배열에 대한 행렬곱셈의 원소 i, k를 계산하는 최적화된 코드. 최적화 원리는 위 데이터처럼 해당 주소의 메모리를 직접 호출해서 값을 가져오는게 아닌, 바로 메모리의 주소로 접근해서 데이터를 가져오고 있다. |
가변 크기의 배열 | 고정크기의 배열과 같이 배열의 연속성만 파악하면 최적화 코드를 이해하는데 크게 어렵지 않다. |
어셈블리 코드를 보고있으면 뭔가 뇌가 레고가 되는 느낌이야
'Krafton_Jungle > Study' 카테고리의 다른 글
Krafton_jungle 5기 22일차 TIL - LCS, CSAPP (0) | 2024.04.09 |
---|---|
Krafton_jungle 5기 21일차 TIL - DP, 알고리즘 (1) | 2024.04.07 |
Krafton_jungle 5기 19일차 TIL - CSAPP (0) | 2024.04.06 |
Krafton_jungle 5기 18일차 TIL - 알고리즘 문제풀이, CSAPP (0) | 2024.04.05 |
Krafton_jungle 5기 17일차 TIL - 알고리즘 문제풀이 (0) | 2024.04.03 |