2007년 4월 5일 목요일

Transputer에 대한 이모저모

컴퓨터 구조 수업에 처음이자 마지막 과제로 나온것이다.
일단 영문원서부터 훑어 보았다.

영문 원서

The Transputer is a computer on a single chip, meant for embedded applications. It is used in hand held devices such as mobile phones and GPS positioning systems. It doesn't have a screen, keyboard, mouse, etc, but it does have a processor, some memory, and some I/O ports. It was designed and made by the Inmos company, now taken over by SGS Thompson.

The Transputer is a good computer to look at because on the one hand it is real, modern and in common use, and on the other it has a reasonably simple instruction set. David May, head of department of the Bristol University Computer Science department, was a major driving force behind the Transputer, and was responsible for designing its instruction set.

Because the Transputer is intended to be built into hand-held gadgets, the instruction set is designed to be compact so that large programs can fit into small amounts of memory. It is also simple, so that there is room on the Transputer chip for a few K of memory, high speed input/output links to other devices, and support for multiple processes. Despite its relative simplicity, the Transputer is still a complete processor, and rivals much more complicated processors in its expressiveness. In particular it supports graphics manipulation and multiple processes. In other words, it has a mini operating system built in.

The Transputer's instruction set is designed to be robust, so that programs still work if moved to different places in memory, or if moved onto more advanced versions of the Transputer, with a larger word size for example.

As the Transputer is used for embedded applications rather than PCs, information about it is a bit hard to come by. There is a book called "Transputer Instruction Set" written by Inmos and published by Prentice Hall, but it is a technical manual intended for compiler writers, so it is only for those with a strong interest.

개념 :
Transputer은 일반 PC가 아닌 임베디드 어플리케이션이다.
Transputer은 모바일 폰이나 Global Positioning System 과 처럼 휴대하고 다니기 편리하게끔 만들어 져 있다. Transputer은 스크린, 키보드, 마우스 및 기타 주변 장치가 없는 반면 프로세서와 일정한 량의 메모리 및 I/O 포트를 가지고 있다.

Transputer이 좋은 컴퓨터로 각광받아서 사용되고 있는 이유중 하나는 Transputer은 실시간적이고 새로우며 보편적으로 사용이 되여지고 있기 때문이다. 또한 다른 이유는 Transputer은 사용법이 아주 간단하게 되여있다는 것이다.

Transputer은 애초부터 휴대용 기기의 추세에 마추고 또한 규모가 큰 프로그램도 적은 량의 메모리라는 제한적 요소의 구애를 받지 않도록 설계가 되여졌기때문에 그 자체 규모가 작음에도 불구하고 기능은 아주 강력하다.

비록 Transputer은 구조 및 관계가 아주 단순하지만 필경 완전한 프로세서이기때문에 훨씬 더 복잡한 프로세스하고 표현상 경쟁력을 가지고 있다. 특별히 Transputer은 그래픽 처리 및 멀티프로세스를 지원하며 실제상 미니 운영체제를 그 속에 정착하고 있다고 해도 과언이 아니다.

Transputer의 instruction set은 상당히 견고하게 만들어져 있기때문에 프로그램을 메모리상 다른 곳으로 옮겼다 할지언정 프로그램의 정상적인 동작에 아무런 영향을 끼치지 않는다.

레지스터
레지스터는 프로세서에 내장된 특수한 메모리 영역이다.

Areg, Breg, Creg: 실제 레지스터에는 여러가지가 있는데 이런 레지스터들은 직접 연산 및 논리 회로하고 연관이 되여져 있다. 우리가 늘 사용하고 있는 대부분의 연산 및 논리 계산들은 Areg, Breg를 사용하여 되여지고 결과값은 Areg속에 저장이 되여진다. 그리고 Creg는 counter용으로 많이 사용이 되여진다.

Lptr: 이것은 명령어 포인터, 혹은 프로그램 포인터라고 불리운다. 이 포인터는 다음번에 실행이되여질 프로그램 명령어가 위치한 메모리 주소를 가리키고 있다.

Wptr: 이것은 웍스페이스 포인터, 혹은 데이타 포인터라고 불리운다. 이 포인터는 현재 실행중인 프로그램이 사용하고 있는 메모리 주소를 가리키고 있다.

Oreg: 이 레지스터는 부분 피연자를 가지고 있다. 또한 이 레지스터는 hex형식으로 디스플레이가 되여진다.

데이타
Transputer에 내장된 메모리는 프로그램 및 그 자체 데이타를 모두 저장한다. 보통 메모리의 첫시작부분은 프로그램을 저장하는데 사용이 되여지고 메모리의 마지막 끝부분은 데이타를 저장하는데 사용이 되여진다.
일단 Transputer이 실행이 되여지면 wptr은 메모리 마지막 주소를 가리키고 있다. 데이타에 대한 메모리 공간의 수요에 따라 wptr가 가리키는 주소는 앞으로 이동이 되여질수 있다.

Transputer을 이용한 산술적 연산

42    ldc 2
43    ldc 3
f5    add

위에 열거한것은 Transputer용 어셈블리 언어를 이용하여 작성된 심플한 프로그램이다.
매개 명령어 왼쪽에는 열거된 수치는 Transputer 명령어들을 기계어로 번역한 결과이다.
예를 들어, 맨 처음에 열거된 42 ldc 2가 의미를 분석하여 보면 ldc는 Load Constant의 약칭으로써 상수값을 레지스터에 읽어들이는 명령어이고 이것이 기계어로 번역되면 4비트 헥사코드로 된다. 즉 4(Hex값으로 0100)로 된다. 뒤에 피연산자는 2인데 그대로 번역이 되여져 2(Hex값으로 0010)로 된다.
이로부터 알수 있는바 모든 명령어 및 피연사자 조합들은 8비트 핵사 값으로 번역이 되여진다.
위에 예제에서 ldc 2를 하면 2라는 수치가 Areg에 저장이 되여지고 ldc 3을 하면 3이라는 수치가 Breg에 저장이 되여지며 add하면 Areg에 저장된 2와 Breg에 저장된 3이 합해지고 결과는 Areg에 저장이 되여진다.

또 다른 예를 들어보자,
(5+1) * (3+4)
위와 같은 연산을 하려면 아래와 같이 프로그램을 작성하면 된다.

45    ldc 5
41    ldc 1
f5    add
43    ldc 3
44    ldc 4
f5    add
25
f3    mul

웍 스페이스

복잡한 연산을 하다보면 단순히 결과를 Areg에 저장하는것으로만으로 부족함을 느끼게 된다.
이때 프로그래머는 웍스페이스에 일정량의 공간을 확보하여 연산된 결과값을 웍스페이스에 넣을수 있다.

60
bd    ajw -3
b3    ajw 3

위 프로그램에서 보면 ajw -3 은 "Adjust the workspace pointer by -3 words" 의미로써 웍스페이스상에 -3워드 만큼한 공간을 확보하는것을 말한다. C에서 malloc이라고 생각하면 되겠다.또한 ajw 3 을 실행하면 할당이 되여졌던 공간이 다시 회수되여지는것을 볼수 있다. C에서 free라고 생각하면 되겠다.^^

조건식 및 반복문의 구현

Transputer용 어셈블리어를 사용하여 "if ... then ... else"와 같은 조건문을 어떻게 구현할것인가?
아주 쉽다. 단순히 testing 과 jumping을 유기적으로 잘 조합하여 사용하면 된다.

Testing...
테스팅이라하면 단순히 논리연산을 의미한다.
0으로 결과가 false임을 표시하고 1로서 결과가 true임을 표시한다.

43    ldc 3
c4    eqc 4
45    ldc 5
c5    eqc 5

첫 구절은 무난히 상수 3을 Areg에 로드하고 있음을 알수 있다.
두번째 구절에서 eqc는 Equal Constant의 약자로서 Areg속에 저장된 수치와 상수 4가 동일한지를 비교해 보는 비교연산자이다. 만약 일치하면 수치 1(true)이 Areg속에 저장이 되여지고 아니면 수치 0(false)이 Areg속에 저장이 되여진다.

Jumping...

5+4+3+2+1 와 같은 연산을 C언어로 프로그래밍하게 되면 아래와 같은 코드가 나올것이다.

n = 5;
t = 0;
while (n > 0)
{  t = t + n;
   n = n - 1;
}

이것을 어셈블리 언어 수준으로 번역하게 되면 아래와 같은 코드를 작성해야 할것이다.

ajw -1     (초기화)
ldc 5
stl 0
ldc 0

ldl 0      (반복부분)
jz 8
ldl 0
add
ldl 0
adc -1
stl 0
j -10

첫 ajw -1은 웍스페이스에 -1 워드만큼한 공간을 확보하겠다는 뜻이다. 즉 초기화 과정이다.

다음 ldc 5는 상수 5를 Areg상에 로드하고 stl 0는 Areg속에 저장되여진 상수를 웍스페이스상 0라는 addr위치에 저장하고 싶다는 뜻이다. 즉 C언어 코드와 비교해 볼때 변수 n을 여기서 초기화해주었다.
ldc 0함으로써 t값을 0로 초기화 시켜주었다.
ldl 0 명령어는 현재 Areg 속의 0 값 즉 t값을 Breg로 이동시키고 Areg속에 메모리 주소 0값을 저장시킨다(메모리주소 0에는 실제 n값이 저장되여있다. 즉 5 이다.).
jz 8명령어는 Testing & Jumping Instruction이다. 실제 테스트 되는 대상은 Areg 에 있는 값이며 만약 Areg의 값이 0이라면 해당 Instruction Line으로 Jump한다.
윗 프로그램에서 Areg값이 5이므로 jz 8을 거쳐 Areg값이 0으로 업뎃이 되여지고 ldl 0으로서 다시금 메모리속의 값 5가 Areg속에 저장이 되여진다. 다음 add를 거치면 Areg 5 와 Breg 0이 합하여진 값이 Areg에 저장이 되여지며 5가 된다. ldl 0를 하면 Areg값 5가 Breg로 이동이 되여지고 Areg에 값 5가 저장되여진다.
ldl 0, adc -1, stl 0 Instruction 사용하여 메모리상 저장이 되여져있던 5값을 불러와서 -1 한후 메모리에 저장한다.

Transputer로 구현해본 간단한 버블정열 프로그램소스

ajw -6
ldc 19
stl 5
ldc 2
stl 4
ldc 5
stl 3
ldc 7
stl 2
ldc 1
stl 1
ldc 4
stl 0  ; 여기까지 Data영역에 초기화 수치를 저장...

ldc 0  ; 카운터 수치에 대한 초기화
stl -1

ldl 0  ; 첫 숫자를 읽어들임

ldlp 0  ; 현재 포인터를 구함
eqc 1020
jz 2
stopp

add
ldlp 0
ldc 1000 ; 카운터가 저장되여있는 포인터 위치를 지정함
ldnl -1  ; 카운터수치를 읽어 들임
add  ; 실제 포인트 해야 할 주소를 계산해 냄

ldc 1000 ; 실제 메모리 주소 값을 다른 데이타 공간에 저장함
stnl -2
ldc 1000
ldc 1000
ldnl -2

eqc 1020 ; 메모리 실제 주소가 1020과 같으면 곧 마지막 수자하고 비교하였다는것을 의미하므로 웍스페이스 공간을 1만큼 pop해야 한다.
jz 15

ajw 1  ; 웍 스페이스 공간을 하나 POP해냄
stnl -1
ldc 1000
stnl -1
ldc 1000
stnl -2
j -48

add
ldnl -2


ldnl 1  ; 포인터가 가리키고 있는 주소의 데이타를 읽음

gt

ldc 1000 ; 카운터에 다음번 주소를 가리킬수 있도록 4를 더해줌
ldnl -1
adc 4
ldc 1000
stnl -1

jz -66
 
ldl 0  ; 실제 두 수를 Swap한다

ldlp
ldc 1000
ldnl -1
add

ldc 1000
stnl -2
ldc 1000
ldnl -2

ldnl 0
stl 0
ldc 1000
ldnl -2
stnl 0

j -94






http://www.cs.bris.ac.uk/~ian/transput/

댓글 없음:

댓글 쓰기