본문 바로가기

무언가 만들기 위한 지식/SPARC Assembler

SPARC Assembler Array Control

지난번에 이어 이번에도 1차원 Array를 이용하여 여러가지 제어를 해볼 것이다.
2차원 배열, 3차원 배열도 가능하기는 하나, 3차원까지는 어셈블러로 거의 쓰일일은 없을 것이고,
2차원의 경우 공식이 은근이 복잡하다.
2차원배열에 이중 for문까지 들어간다면 아마도 소스가 상당히 복잡하고 레지스터도 얽히면서 쓰일것이 예상된다.
(한마디로 개노가다가 예상된다 ㅠ.ㅜ)
하는 방법은 결국 메모리 주소를 중심으로 계산해 나가면 된다.(행 크기로 연산을 수행하면 된다.)
그건 차후 시간이 생기면 직접 작성하여 코드를 올려볼 예정이다.
일단 일차원이나 마스터 하자 -.,-; 아래 몇 개 기능 없는데도 120줄이 된다....

요구사항
1. 입력받은 배열값들의 합을 구하여 출력하라.
2. 입력받은 배열값들의 평균을 구하여 출력하라.
3. 입력받은 배열값 중 최대값을 구하여 출력하라.
4. 입력받은 배열값 중 최소값을 구하여 출력하라.
5. 입력받은 배열의 모든 값들을 순차적으로 출력하라.
6. 입력받은 배열값의 개수가 짝수일 경우, 중간에 위치하는 두개의 값의 평균을 출력하라.
                                        홀수일 경우, 중간에 위치하는 하나의 값을 출력하라. (홀수이니 중간값은 한개)

위 6개의 조건에 맞추어 전에 구현했던 배열 루프를 이용하여 작성해 보았다.
대부분의 내용은 주석을 영어로 작성해 놓았으니, 각 레지스터의 값이 헷갈리다면 직접 주석을 읽어보고 생각해보자.

[작성환경 : solaris sparc machine  작성툴 : Vi editor   컴파일러 : gcc]


1~12 Line : 출력을 위한 기본 Data영역 설정이다.
21~36 Line : 입력받기 위한 반복루틴.
37~58 Line : 최소, 최대 값을 구하기 위해 배열순환루틴이다. 최대, 최소시 약간 시간이 걸렸던 이유가 두개의 루틴이 조건에 의해 하나만 되어야 하는 것이 아니라 둘다 돌아야 한다. 또한 최대 최소를 비교하는 최소값(위 소스에서는 %i0와 %i1)을 0으로 해줄 경우 최소값이 항상 0이 나오는 낭패를 볼 수 있다. 즉 %i0와 %i1에는 배열의 처음 번지의 값을 저장해 주어야 한다. ※ 38, 39 Line을 보면 ld를 이용해 초기화하였다.
60~79 Line : 최소값, 최대값, 합, 평균등을 출력한다. 평균은 모든 합을 입력된수 %l7로 나누었다. 참고로 어셈블리는 무조건 내림이다. (srl을 사용해도 내림, 같은 방식으로 처리된다. 즉 2의 배수로 나눌때는 srl을 사용하는 것이 효율적이다.)
80~93 Line : 배열을 순차적으로 출력한다.
94~120 Line : 짝수일 경우와 홀수일 경우에 따라 나뉘는 조건이다.
짝수는 총 입력 개수를 나누기 2를 한 후에 그 위치에 맞는 수를 저장, 인덱스를 하나 -1 하여 그 위치에 맞는 값을 저장한다. 그후 두수를 더하고 2로 나누어 평균을 구하여 출력한다. 이때 나누기 연산은 모두 srl로 대체 하였다. (나누기 자체가 call이고 내부적으로 많은 연산을 하기 때문에 2의 승수로 나눠질 경우 무조건 srl을 써야한다. 참고로 sra는 쓰면 안된다.) -1을 하는 이유는 배열의 Index는 모두 아시다시피 0으로 시작하기 때문이다.
홀수일 경우네는 가운데 값을 출력한다. 이때 나누기 2를 하면(srl) 자동으로 내림하여 계산이기 때문에 알맞은 Index가 이미 설정되었다.(홀수라서 그렇다.)
 
결과값은 다음과 같이 나타난다.
처음이 입력값의 개수가 홀수일 경우 이며, 두번째의 실행은 입력값의 개수가 짝수일 경우이다.


<확인해보면 각 최대, 최소, 합, 평균, 배열, 홀/짝 Case의 값이 잘 나온 것을 볼 수 있다.>