본문 바로가기

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

SPARC Architecture Assembler Register&Operater

※ Assembler 포스트는 모두 Sun사의 Sparc를 기반으로 작성된 것입니다.


Sparc Architecture는 Load/Store Architecture로 구성되어 있다.
Load/Store Architecture는 Stack machine과 매우 유사하다. (스택대신 레지스터를 사용)
Stack과 Register 파일의 가장 큰 차이점은
Register는 어떤 레지스터(CPU상의) 라도 각 명령으로 선택할 수 있고,
반면에 Stack은 최상의 두개 elements만 접근이 가능하다.
Load/Store Architecture를 그림으로 보면 위와 같다.

복잡한 용어를 제외하고 설명한다면, CPU에서 메모리에서 데이타를 읽고 레지스터를 읽어 연산을 수행하고, 결과를 다시 메모리로 보내는 과정이다.

ALU : Arithmetic Logic Unit
PC : Program Counter
MAR : Memory Address Register
MDR : Memory Data Register
IR : Instruction


CPU의 이러한 구조에 대해 설명한다면 너무 길어지고,
Computer Architecture라는 과목에서 배울 한학기 내용이다. 그러한 이유로 너무 깊이 들어가지는 않을 것이다.

레지스터는 메모리와는 달리 접근이 빠르고 컴퓨터 조작에 직접적인 접근이 가능하다. 위 그림만 보아도 ALU를 통한 연산과정에서 임시저장장소로 쓰이는 것을 알 수 있을 것이다.
이러한 레지스터를 어셈블리어에서는 직접 제어를 하게 될 것이다.
그러기 위해서는 각 레지스터의 특징과 성질, Sparc에서 제공하는 레지스터에 대하여 알고 넘어가야 한다.

The Sun SPARC는 프로그래머를 위해 총 32개의 레지스터를 제공한다. 32개의 레지스터는 논리적으로 4가지로 나눌 수 있다.
%g0~%g7 : Global, 전역변수처럼 전역레지스터로 프로그램내에 어느  곳에서나 접근이 가능하도록 설정하는 레지스터이다.
%l0~%l7 : Local, 지역 함수의 변수로 사용되고 가장 많이 무난하게 쓰인다.
%i0~%i7 : In, 함수에서 인자 입수로 사용(함수에서 인자로 않쓰일 경우 Local Register 처럼 쓰인다.)
%o0~%o7 : Out, 함수에서 인자 전달 사용


i와 l 레지스터는 서로 긴밀하게 연결되어 있다.
(함수로 쓰일때 인자 입수와 전달로 쓰이므로 같은 값으로 주고 받게 된다. 후에 자세히...^^)

모든 레지스터는 signed integer로
-2^31<=n<2^31까지의 수가 저장가능하다. 이는 대략 |n|<10^9이다.
더 큰수 float등의 표현도 실제로 가능하나, 그 부분에 대해서도 후에 다룰 것이다.(이야기가 길어져서 ^^)

 Register Synonyms(동의어)  특징 
%g0 %r0 항상 0이 기록, 다른 값으로 덮어 씌어도 결국은 다시 0으로 초기화 된다. 주로 쓰레기 값으로 처하거나 0으로 초기화 시킬때 자주 사용됨. 
%g1 %r1 전역 데이터로 사용
%g2 %r2  ″
%g3 %r3  ″
%g4 %r4  ″
%g5 %r5  ″
%g6 %r6  ″
%g7 %r7  ″

 
Register Synonyms(동의어)  특징 
%o0 %r8 subroutines에의 인자전달로 쓰임
%o1 %r9
%o2 %r10
%o3 %r11
%o4 %r12
%o5 %r13
%o6 %r14 Stack Point로 사용된다. %sp로 쓰임. 한부로 수정하면 안됨. 
%o7 %r15 호출된 subroutine의 리턴 address의 값이다. 함부로 수정하면 안됨.

 
Register Synonyms(동의어)  특징 
%l0 %r16  지역변수로 자유롭게 사용
%l1 %r17 
%l2 %r18 ″ 
%l3 %r19 ″ 
%l4 %r20 ″ 
%l5 %r21 ″ 
%l6 %r22 ″ 
%l7 %r23 ″ 


Register Synonyms(동의어)  특징  
%i0 %r24  Subroutine에서 인자 입수로 쓰임. 
%i1 %r25   
%i2 %r26  
%i3 %r27  
%i4 %r28  
%i5 %r29  
%i6 %r30 Frame Point로 사용된다. %fp 
%i7 %r31 Subroutine의 return address로 사용


fp와 sp는 메모리 영역 할당과 관련된 pointer로 나중에 좀더 깊이 설명이 들어갈 것이다^^.


SPARC에 대해 좀더 자세히 알고 싶다면 :
http://enc.daum.net/dic100/contents.do?query1=10XXX50034

여러 레지스터에 대해 알고 싶다면 :
http://k.daum.net/qna/openknowledge/view.html?category_id=KE&qid=2fL6i&q=instruction+register&srchid=NKS2fL6i