지난 글에서는 스택 프레임을 사용하는 예제를 정리하였다. 이번 글에서는 스택 메모리에 일차원 배열을 선언하는 방법을 정리하고자 한다. 스택에서 일차원 배열 선언하기 함수 안에서 아래와 같이 변수를 선언한다고 해보자. int a; int array[5]; int b; 이 경우, 실제 스택에는 지역변수들이 어떤 순서로 들어갈까? 우선 선언한 순서대로, 높은 주소인 %fp부터 채워지므로 a > array > b 순서로 채워진다. 그렇다면 array 내부에서는 어떤 순서로 채워질까? array 내부에서는 array[0]~array[4] 가 주소가 '증가하는' 순서대로 할당이 되어야 한다. 그런데 스택에서는 점점 주소가 감소하는 방향으로 공간이 넓어지므로 아래와 같은 순서로 할당받게 된다. [높은 주소] [낮은 ..
연사님 이력 -홍익대학교 컴퓨터공학과 9x학번 -컴퓨터공학과 학술학회 학회장 -(전) 네이버메일서비스개발팀 팀장 -(현) NHN 두레이 대표이사 -(현) NHN 개발자 채용업무 및 신입사원 기술 교육 담당 공지 올라온거 보고 200명 선착순이라길래 엄청 몰릴 줄 알고 후다닥 신청했는데, 막상 현장 가보니까 20명? 정도 왔더라 개인적으로 연차가 높고, 채용 업무를 진행하고 계시는 분의 강연은 정말 좋은 기회라고 생각했다. 여러가지 주제를 가지고 이야기 해주셨는데, 기억나는대로 두서없이 적어보고자 한다. (나중에 PPT 자료 공유해주신다는데, 아직 못 받았다. 나중에 받으면 이 글도 좀 더 깔끔하게 정리하고 싶다.) 자기소개 + 회사홍보? 밥을 늦게먹어서 조금 지각하는 바람에 자기소개 중에 들어갔는데, 그..
지난 글에서는 스택 프레임의 개념에 대해 정리하였다. 스택프레임은 스택이라는 메모리 공간을 차지하는 기본 단위이다. 서브루틴을 호출할 때마다 레지스터와 스택프레임이 할당된다. 이때 할당되는 스택프레임의 크기는 save 명령어를 통해 지정할 수 있는데, 최소 사이즈는 64바이트였다. (l-register, i-register 저장 용도) 만약 스택 프레임 내에서 또다른 함수를 호출한다면, 구조체 반환 포인터 크기 4byte와, 매개변수 전달 용도의 24byte 사이즈 공간이 추가로 더 필요해 최소 92byte 사이즈가 필요했다. 여기에 만약 지역변수를 추가로 사용한다면 사용할 지역변수의 총 사이즈만큼 추가로 할당이 필요했다. 마지막으로 총 사용하는 사이즈 크기를 8의 배수로 맞춰 생성해야 한다. 스택 프레..
https://www.acmicpc.net/problem/3653 3653번: 영화 수집 각 테스트 케이스에 대해서 한 줄에 m개의 정수를 출력해야 한다. i번째 출력하는 수는 i번째로 영화를 볼 때 그 영화의 위에 있었던 DVD의 개수이다. 상근이는 매번 영화를 볼 때마다 본 영화 DVD www.acmicpc.net 세그먼트 트리 연습 문제로 풀게 된 문제 1시간을 고민해도 아이디어가 전혀 안 떠올라서 블로그 3~4개 풀이를 다 읽어보고 겨우 이해했다. 그리고 구현하는데 또 시간초과 나서 구현 디테일 수정하느라 30분은 또 쓴 것 같다. 영화를 볼 때마다 꺼낸 영화보다 위에 있던 영화들의 위치가 한칸씩 밀리는 것이 이 문제의 어려운 점이다. 이는 N+M개의 리프노드를 가지는 세그트리를 구현하여 해결할 ..
지난 글에서는 SPARC의 (근데 찾아보니 아마도 기본적인 컴퓨터 공통의) 메모리 맵을 정리하면서 BSS 섹션의 내용을 추가로 정리하였다. bss 섹션은 정적 메모리 영역 중 하나로, 이곳에 할당한 변수는 모두 0으로 초기화되는 특징이 있었다. 이번 글에서는 다시 '스택' 영역으로 돌아와서, 새로운 스택 영역의 메모리를 할당하는 단위인, '스택 프레임' 에 대해 정리하고자 한다. Stack Frame (스택 프레임) 스택 프레임은 나중에 정리할 '서브루틴' 과 관련되어 있다. 서브루틴(함수)는 호출될 때마다, 레지스터 공간과 함께 스택 공간을 새로 할당한다. 이때 각 함수마다 할당하는 스택 공간의 크기를 임의로 지정할 수 있는데, 이 스택 공간을 '스택 프레임' 이라고 한다. 즉, 스택 프레임은 서브루틴..
지난 글에서는 set 합성 명령어의 구조와 작동 원리를 알아보았다. set 명령어는 sethi 명령어와 or 명령어의 조합으로 이루어져 있으며, sethi 명령어는 피연산자로 들어온 메모리 주소값의 상위 22비트를 마찬가지 피연산자로 들어온 레지스터의 상위 22비트에 쓰는 명령어이다. or 명령어로는 나머지 하위 10 비트의 데이터를 레지스터의 하위 10비트에 쓴다. (32비트의 주소값 데이터를 2번에 걸쳐 레지스터에 쓴다.) 이번 글에서는 SPARC의 메모리 맵을 다시 한번 살펴보면서 지난번에 정리하지 못했던 정적 메모리 영역 중 bss 영역에 대해 추가적으로 정리하고자 하려고 했으나... 강의록에 bss 부분에 대한 내용이 너무 없어서 그냥 SPARC 메모리 맵을 복습하는 느낌으로 작성하려고 한다. ..
https://www.acmicpc.net/problem/2243 2243번: 사탕상자 첫째 줄에 수정이가 사탕상자에 손을 댄 횟수 n(1 ≤ n ≤ 100,000)이 주어진다. 다음 n개의 줄에는 두 정수 A, B, 혹은 세 정수 A, B, C가 주어진다. A가 1인 경우는 사탕상자에서 사탕을 꺼내는 경우이 www.acmicpc.net 학교 동아리 스터디에서 세그트리 연습문제로 나와 풀게 되었다. 스터디 수업때 다뤘던 연습문제와 세그트리를 적용하는 결이 달라 한참 고민을 하고 풀었다. 보통 '세그먼트 트리' 하면 유명한 연습문제가 '구간 합 구하기' 이다. https://www.acmicpc.net/problem/2042 2042번: 구간 합 구하기 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,0..
data영역 메모리에 데이터를 저장하고 나서 메모리에 저장된 데이터를 가져오기 위해 그 메모리 위치를 label로 표시할 수 있다. 이때, 문자열로된 label로부터 실제 메모리 주소값을 가져오는 명령어가 set 이다. .data i_m: .word 4 j_m: .word 9 k_m: .word 3 위 코드에서는 data 영역에 4바이트 크기의 메모리 공간 3개에 각각 4, 9, 3을 저장하고, 각 메모리 주소를 i_m, j_m, k_m 으로 표시하였다. 이때 i_m, j_m, k_m 이 가리키는 메모리 주소는 아래와 같이 가져올 수 있다. set i_m, %o0 위 코드는 i_m의 주소값을 가져와서 %o0 레지스터에 저장하는 코드이다. 한편, 지난 지연주기 최적화 글에서 set은 nop에 바로 넣을 수..
https://www.acmicpc.net/problem/27172 27172번: 수 나누기 게임 《보드게임컵》을 준비하다 지친 은하는 보드게임컵 참가자들을 경기장에 몰아넣고 결투를 시키는 게임 《수 나누기 게임》을 만들었습니다. 《수 나누기 게임》의 규칙은 다음과 같습니다. www.acmicpc.net 에라토스테네스의 체를 구하는 과정을 응용하여 푸는 문제이다. 수가 10만개 이므로, 임의 두 수의 쌍을 모두 구해서 대결을 시키는 것은 시간내에 풀 수 없다. 1. 미리 1부터 100만까지 모든 수에 대한 점수를 저장할 리스트를 만들어 두고, None으로 초기화를 시켜둔다. (점수가 음수가 될 수 있기 때문이다) 2. 플레이어가 가진 수로 주어진 모든 수에 대해 점수를 0으로 설정한다. 3. 각 플레이어..
원래는 12월에 올해 회고로 몰아서 쓰려고 했는데, 이번 달은 뭔가 이벤트가 많았다보니 이 경험들을 지금 생각날 때 글로 정리하고 싶어서 미리 쓰게 되었다. 작년 회고글 마지막에 2023년에 하고 싶은 것들 쭉 적어둔게 있었는데, 그거는 2023년 회고에서 얼마나 이뤘는지 리뷰를 해보려고 한다. 그런데 그때는 프론트에 관심이 많았지만, 지금은 프론트 관심이 조금 떨어져서 그런가 그때 세운 목표와 내가 지금까지 해온 것들의 차이가 있다. 암튼 이 내용은 2달 뒤에 정리해서 적어봐야겠다. 지난 회고글을 월별로 나눠서 적었는데, 지금 읽어보니까 조금 읽기 불편한 방식으로 글을 구성한 것 같아서 이번에는 이벤트 단위로 끊어서 시간 순으로 적되, 제목을 확실히 달아서 쭉 적어보려고 한다. 추석 연휴 (~10/3)..