목록전체 글 (87)
공부중

(유튜브 영상을 보며 공부용으로 정리한 것이며 출처는 아래에 있습니다) - 아래 예제를 통해서 스택이 쌓이는 과정 알아보고, 포인터 변수가 필요한 이유를 알아본다. - 작성된 코드를 ► 로 따라가면서 스택과 console 에 어떻게 값이 저장되고 출력되는지 알아본다. - 포인터 변수의 기본 개념과 활용에 대해 예제와 함께 알아본다. 전역변수가 선언되지 않았으니 데이터 세그먼트는 필요가 없다.지역변수가 저장되는 stack 만 필요함 int i = 10 이라는 지역변수가 선언됨과 동시에 초기화되었음스택에 i 라는 이름의 4바이트 공간이 할당되고 ( 변수 i 의 선언 )거기에 10의 값이 PUSH 됨 ( 변수 i 초기화 ) PLUS 라는 함수 호출되어서 PLUS 라는 함수를 위한 스택 공간이 ..

(유튜브 영상을 보며 공부용으로 정리한 것이며 출처는 아래에 있습니다) - [자료구조] 메모리 구조와 스택1 과 이어지는 내용- 지역변수와 전역변수가 혼용되어 코드가 작성되었을 때 스택에서 메모리 활용이 어떻게 일어나는지 알아보기 sum 이라는 함수가 지역변수와 전역변수에서 혼용되어 사용되고있다. 스택에 a, b, sum 의 공간을 생성하고 초기화 되지 않았기 때문에 null 값을 가짐 a 와 b 값을 초기화 시켜줌으로써 스택에 a 와 b 값 저장 add 함수가 호출되고, add 의 int a 와 int b 값이 스택에 저장됨 이전 글에서는 sum 이라고 하는 변수가 add 함수 안에서 int sum; 로 지역변수로써 선언이 되고 나서, sum 변수의 합을 연산하였다.하지만 이번에는 add..

(유튜브 영상을 보며 공부용으로 정리한 것이며 출처는 아래에 있습니다) c 언어로 작성된 프로그램을 컴퓨터가 이해할 수 있는 언어로 번역하는 과정 -> 컴파일 컴파일된 실행 파일을 실행해서 콘솔에서 확인할 수 있게 되는 것이러한 컴파일 과정, 실행 과정에서 여러가지 정보들이 메모리에 적재된다.- 코드 영역프로그램 코드가 저장이 됨. 우리가 이해하는 언어에서 컴퓨터가 이해하는 언어로 번역된 결과들이 저장되는 곳- 데이터 영역데이터가 저장됨전역변수, 정적 변수, 문자열 등등이 저장되는 영역* 전역 변수 : 어떠한 한 프로그램 내에서는 어디서든지 사용 가능한 변수* 지역 변수 : 어떤 특정한 함수 안에서만 사용되거나 아니면 대괄호로 영역 구분이 된 안에서만 사용할 수 있는 변수전역 변수와 지역 변수의 ..

포인터는 변수이다. 값을 저장하는 일반 변수와 달리 메모리 주소를 저장한다는 점이 다를 뿐이다. 포인터는 다음과 같이 데이터 형식 뒤에 *를 붙여 선언한다. 데이터 형식* 포인터; int 형식 메모리 주소를 저장하는 포인터는 다음과 같이 선언한다. int* ptr; 다음과 같이 포인터에 주소값을 할당할 수 있다. int* ptr = 0xFF000000; 그리고 주소 연산자 &를 이용해서 다른 변수의 주소를 할당할 수도 있다. int a = 123;int* ptr = &a; | c언어 증감 연산자 c언어에서는 포인터에 증감 연산자를 사용할 수 있다. 가령 int 형식이 32비트 (4바이트) 인 시스템에서 기반 데이터 형식이 int 인 포인터에 ++ 연산자를 적용하면 주소값이 32비트로 증가하고, ..

| 변수의 이름 설정 - 문자와 숫자로 구성 - 반드시 문자로 시작 (6x, end, n! -> 안됨) - 대소문자 구분 - 내장함수와 지정된 변수 (ex. pi, ans, inf, i, j, NaN)는 피한다. 만약 사용하면 지정한 변수로만 사용한다. | 메모리에 있는 변수 확인 명령어 who / whos | 변수 지우는 명령어 - clear : 메모리에 있는 모든 변수를 지운다. - clear 변수 이름 : 변수이름만 메모리에서 지운다. - clc : 화면을 지우는 명령어 | 작업 과정과 변수의 저장 - 작업 과정 저장 ' diary fname ' diary 가 실행된 이후의 모든 작업은 'fname'이라는 파일에 저장됨 더이상 저장을 원치 않을 때는 diary off 을 실행함 이렇게 저장된 파일은..

| 엔트리 포인트 디버거를 통해 프로그램을 열면 실행되지 않고 특정지점에서 멈추는 것을 확인 할 수 있다. 이 지점을 엔트리 포인트(EP: Entry Point) 라고 한다. 엔트리 포인트는 운영체제가 사용자 프로그램으로 최초로 제어를 넘기는 지점이다. 프로그래머가 만든 실행 코드가 최초로 실행되는 지점이라고 생각하면 이해가 쉽다. PE 구조의 모든 실행파일은 헤더 영역에 엔트리 포인트가 상대주소(RVA) 로 지정되어있다. 앞에서 언급했듯이 프로그램은 로딩되면서 베이스주소(Base Address)가 할당되고 메모리에 베이스 주소와 상대주소가 더해진 위치에(Base Address + RVA) 데이터가 저장된다. * 상대주소 : 특정 값을 기준으로 얼마나 떨어져있는지. IMAGE_OPTIONAL_HEADER..

윈도우 에서는 음수를 표현할 때 2의 보수 방식으로 표현한다. 즉, 이진수에 대해 NOT 연산을 한 다음에 1을 더해준다. 그러면 음수 4가 되는 것이다. NOT 연산 : 0과 1을 반전시키는 것 즉, 이진수 '0000 0100'을 NOT 연산하면 '1111 1011' 이 된다. 그리고 결과에 1을 더하면 2의 보수가 된다. 2즉, '1111 1011'에 1을 더하면 '1111 1100'이 되고 그것을 16진수로 바꾸면 'FC'가 된다. * +1 을 해준다는 것은 ' 0000 0001 '을 더해주는 것 “어떤 수를 부호를 바꾸고자 한다면 비트를 반전시킨 뒤 1을 더하면 된다.”
함수 호출 규약(calling convention) 이란 함수를 호출 할 때 인자를 전달하는 방식과 함수 실행이 끝나고 스택을 정리하는 방식에 대한 약속이다. 하나의 Function(Caller) 에서 또 다른 Function(Callee)을 호출할 때 사용되는 일종의 protocol 인 것. 중요한 것은 caller 가 어떻게 parameters 를 callee 에 전달하는지, caller 또는 callee 가 stack 을 clean 하는지 등등은 debugging 시에 중요한 정보가 될 수 있다. 함수 호출 규약에는 크게 'cdecl', 'stdcall', 'fastcall' 이렇게 세가지 방식이 있다. 'cdecl' 방식 인자가 오른쪽에서 왼쪽으로 순서대로 스택으로 전달된다. 함수가 종료될 때 호..

배열 자료구조 : 동일한 데이터형 변수의 집합을 의미한다intintintintint * 다른 데이터형 변수의 집한은 '구조체' 라고 함int dubleboolcharunit 1차원 배열 선언 규칙 > array 연산자 > 배열명 뒤의 [ ] 안에 정수형 배열 크기를 지정하면 그 크기만큼 배열 요소 (원소, 방) 가 할당됨 배열의 특징 > 동일한 데이터 형 변수의 집합이다> 메모리 상의 연속적인 공간에 할당된다. byte 단위로 주소가 할당되어있음> 배열 명은 곧 그 배열의 시작 주소 상수이다. (*상수: 변하지 않는 값)> 배열 요소는 첨자로 구분하며, 첨는 0(zero) 부터 시작된다. 배열 초기화 > 배열 전체의 초기화는 배열 선언문에서만 가능하다. > 초기화 데이터는 중괄호 { } 로..

2.1 재귀함수 함수형 프로그래밍에서는 반복을 표현할 때 반복문 대신 재귀함수를 주로 사용한다. 재귀 함수는 반복문의 개념을 포함하는 일반 적인 개념일 뿐 아니라 재귀적으로 생각하면 문제를 다른 각도에서 보다 쉽게 해결할 수 있는 경우가 많기 때문이다. 재귀적으로 문제를 푸는 방법 연습 • 풀고자 하는 문제의 크기가 충분히 작은경우에는 직접푼다. • 그렇지 않은 경우, 1. 원래 문제를 동일한 구조의 부분 문제들로 쪼갠다. 2. 쪼개진 부분 문제들의 해들을 재귀적으로 구한다. 3. 부분 문제들의 해를 모아서 원래 문제의 해를 구성한다. 리스트의 길이 구하기 let rec length l = match l with | [] -> 0 | hd::tl -> 1 + length tl >빈리스트의 경우 길이는 0..