CS/어셈블리

CS/어셈블리

[SPARC] 30. 서브루틴 개요 & call, jmpl, ret, retl

지난 글에서는 구조체가 메모리에 어떻게 저장되는지를 정리하였다. 구조체도 배열과 마찬가지로, 먼저 선언된 변수가 낮은 주소의 값 (%fp에서 먼 쪽)을 가진다. 그래서 먼저 선언된 변수의 위치를 기준으로 직접 경계 정렬을 하여 전체 구조체가 가지는 사이즈를 계산한 뒤, 구조체의 시작 위치를 구조체 내 변수중 가장 큰 사이즈의 배수로 맞추어 선언하면 되었다. 이번 글부터는 서브루틴에 대해 좀 더 자세하게 정리하고자 한다. 서브루틴 서브루틴은 '특정 작업을 여러번 수행하는 연속된 명령어의 나열' 으로 볼 수 있다. 서브루틴의 실행 과정을 한번 정리해보자. 1. 인자값 설정 o-register 에 값을 할당하여 매개변수로 넘길 값을 설정한다. (인자값은 o0 ~ o5 까지 6개 레지스터 범위에서 사용가능하며,..

CS/어셈블리

[SPARC] 29. 구조체

지난 글에서는 다차원 배열에 대한 내용을 정리하였다. row-major, column-major 에 따라 주소값을 구하는 방식이 달라지는 것에 유의하여야 함을 기억하자. 또, 배열 원소 하나의 사이즈에 따라 주소값 계산식에 W 를 다르게 넣어야 함도 유의하여야 했다. 이번 글에서는 스택 메모리 공간에 구조체를 저장할 때 어떻게 저장되는지 정리하고자 한다. 구조체가 메모리에 들어갈 때 다음과 같은 구조체가 있다고 해보자. struct s { int a, b; char c; short d, e; int f, g; } 이때 이 구조체 변수 하나를 스택에 선언하면, 실제 메모리에는 어떻게 저장될까? 구조체도 배열과 마찬가지로 선언된 순서대로 점점 주소가 높아진다. (즉, 마지막에 선언된 변수가 %fp에 가깝다)..

CS/어셈블리

[SPARC] 28. 다차원 배열과 이진수 곱셈 계산

지난 글에서는 일차원 배열에 대한 내용을 정리하였다. 일차원배열을 스택에 선언하는 경우, 배열의 주소는 낮은곳부터 높은 곳순으로 증가하지만, 배열 공간이 선언되는 위치는 지역변수가 선언되는 것과 마찬가지로 높은 주소부터 쌓이는 식으로 선언되었다. 이번 글에서는 다차원 배열에 대해 정리하고자 한다. 다차원 배열의 표현 다차원배열은 결국 선형구조인 메모리에 저장되어야 한다. 이때 선형 구조인 메모리에 어떻게 저장하느냐에 따라 크게 2가지로 나눌 수 있다. 1. row major 2. column major row major 는 우리가 흔히 사용하는 방식으로, 먼저 row 를 기준으로 구역을 나눈 뒤, column 인덱스가 증가할 때 메모리 주소가 순차적으로 증가하고, 모든 column이 다 차면 그때 row..

CS/어셈블리

[SPARC] ld: fatal: relocation error: ~~ symbol .data (section): value ~ does not fit 해결 방법

어셈블리 과제 + 정리하다가 만난 오류이다. 처음 만났을 때는 구글링 실력이 모자라서 그런가, 아무리 검색해도 해결방법이 나오지 않았다. 그러다가 오늘 코드를 한줄 한줄 주석했다가 풀어보면서 이 오류를 발생시키는 코드를 찾았고, 이 오류가 발생하는 원인을 발견했다. data 섹션에 데이터를 선언하고, 이렇게 라벨링을 하였을 때 이렇게 라벨링 된 값을 그대로 가져다가 사용하면 위 에러가 발생한다. 이렇게 반드시 set 명령어를 사용해서 레지스터에 주소값을 옮겨준 후, 연산을 해야 한다.

CS/어셈블리

[SPARC] 27. 일차원 배열

지난 글에서는 스택 프레임을 사용하는 예제를 정리하였다. 이번 글에서는 스택 메모리에 일차원 배열을 선언하는 방법을 정리하고자 한다. 스택에서 일차원 배열 선언하기 함수 안에서 아래와 같이 변수를 선언한다고 해보자. int a; int array[5]; int b; 이 경우, 실제 스택에는 지역변수들이 어떤 순서로 들어갈까? 우선 선언한 순서대로, 높은 주소인 %fp부터 채워지므로 a > array > b 순서로 채워진다. 그렇다면 array 내부에서는 어떤 순서로 채워질까? array 내부에서는 array[0]~array[4] 가 주소가 '증가하는' 순서대로 할당이 되어야 한다. 그런데 스택에서는 점점 주소가 감소하는 방향으로 공간이 넓어지므로 아래와 같은 순서로 할당받게 된다. [높은 주소] [낮은 ..

CS/어셈블리

[SPARC] 26. Stack Frame 사용 예제

지난 글에서는 스택 프레임의 개념에 대해 정리하였다. 스택프레임은 스택이라는 메모리 공간을 차지하는 기본 단위이다. 서브루틴을 호출할 때마다 레지스터와 스택프레임이 할당된다. 이때 할당되는 스택프레임의 크기는 save 명령어를 통해 지정할 수 있는데, 최소 사이즈는 64바이트였다. (l-register, i-register 저장 용도) 만약 스택 프레임 내에서 또다른 함수를 호출한다면, 구조체 반환 포인터 크기 4byte와, 매개변수 전달 용도의 24byte 사이즈 공간이 추가로 더 필요해 최소 92byte 사이즈가 필요했다. 여기에 만약 지역변수를 추가로 사용한다면 사용할 지역변수의 총 사이즈만큼 추가로 할당이 필요했다. 마지막으로 총 사용하는 사이즈 크기를 8의 배수로 맞춰 생성해야 한다. 스택 프레..

CS/어셈블리

[SPARC] 25. Stack Frame

지난 글에서는 SPARC의 (근데 찾아보니 아마도 기본적인 컴퓨터 공통의) 메모리 맵을 정리하면서 BSS 섹션의 내용을 추가로 정리하였다. bss 섹션은 정적 메모리 영역 중 하나로, 이곳에 할당한 변수는 모두 0으로 초기화되는 특징이 있었다. 이번 글에서는 다시 '스택' 영역으로 돌아와서, 새로운 스택 영역의 메모리를 할당하는 단위인, '스택 프레임' 에 대해 정리하고자 한다. Stack Frame (스택 프레임) 스택 프레임은 나중에 정리할 '서브루틴' 과 관련되어 있다. 서브루틴(함수)는 호출될 때마다, 레지스터 공간과 함께 스택 공간을 새로 할당한다. 이때 각 함수마다 할당하는 스택 공간의 크기를 임의로 지정할 수 있는데, 이 스택 공간을 '스택 프레임' 이라고 한다. 즉, 스택 프레임은 서브루틴..

CS/어셈블리

[SPARC] 24. SPARC 메모리 맵 정리 ( + bss 영역)

지난 글에서는 set 합성 명령어의 구조와 작동 원리를 알아보았다. set 명령어는 sethi 명령어와 or 명령어의 조합으로 이루어져 있으며, sethi 명령어는 피연산자로 들어온 메모리 주소값의 상위 22비트를 마찬가지 피연산자로 들어온 레지스터의 상위 22비트에 쓰는 명령어이다. or 명령어로는 나머지 하위 10 비트의 데이터를 레지스터의 하위 10비트에 쓴다. (32비트의 주소값 데이터를 2번에 걸쳐 레지스터에 쓴다.) 이번 글에서는 SPARC의 메모리 맵을 다시 한번 살펴보면서 지난번에 정리하지 못했던 정적 메모리 영역 중 bss 영역에 대해 추가적으로 정리하고자 하려고 했으나... 강의록에 bss 부분에 대한 내용이 너무 없어서 그냥 SPARC 메모리 맵을 복습하는 느낌으로 작성하려고 한다. ..

CS/어셈블리

[SPARC] 23. label로 data 영역의 메모리주소 가져오기 (set, sethi)

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에 바로 넣을 수..

CS/어셈블리

[SPARC] 22. 정적 메모리와 경계정렬

지난 글에서는 메모리와 레지스터 사이 데이터를 주고받는 방법을 정리해보았다. 간단히 정리하면, ld [메모리주소], 레지스터 형태로 메모리에서 값을 불러온다. 메모리주소는 불러올 데이터 크기의 배수여야한다. 만약 ldd 로 8byte 를 불러온다면 레지스터는 짝수번째 레지스터여야한다. 메모리주소는 레지스터와 레지스터(상수) 합으로 표현되며, -레지스터만 없으면 된다. st 레지스터, [메모리주소] 형태로 레지스터 값을 메모리에 저장한다. 마찬가지로 메모리 주소는 저장할 데이터 크기의 배수여야 하고 만약 std 로 8byte 를 저장한다면 레지스터는 짝수번째 레지스터여야 한다. 메모리주소는 레지스터와 레지스터(상수) 합으로 표현되며, -레지스터만 없으면 된다. 이번 글에서는 메모리의 영역 중 static ..

에버듀
'CS/어셈블리' 카테고리의 글 목록 (2 Page)