산술 및 논리 연산의 프로그래밍 컴퓨터에서 이용할 수 있는 명령어의 수는 대형에서는 수백 개, 소형에서는 수십 개에 이릅니다. 어떤 컴퓨터는 주어진 한 동작을 위해 하나의 기계 명령어 를 사용하는가 하면 어떤 컴퓨터는 같은 동작을 실행하기 위하여 여러 개의 명령어를 사용합니다. 따라서 기계 명령어 집합에 주어지지 않는 동작을 실행하기 위해서는 프로그램을 작성하여 사용하는 수밖에 없습니다. 이 절에서는 산술과 논리 동작의 소프트웨어 실행의 예를 들어 보고 고정 숫점 이진 데이타 뿐만 아니라 십진수, 부동 소숫점 데이타에 대한 확장을 고려해 보기로 합니다.
1. 곱셈 프로그램
두 개의 숫자를 곱하는 프로그램을 생각해 보자. 프로그램을 간단히 하기 위 하여 부호 비트를 무시하고 양수만을 가정한다. 두 개의 이진수는 8비트 이하로서 그들의 곱은 16비트를 초과할 수 없다고 가정하고 나중에 부호가 있는 경우와 16비트 숫자들에 대한 경우로 확장시켜 보기로 합니다. 그림 6-3 에서와 같이 곱셈 과정은 승수 Y의 비트들을 체크하여 그것이 1일 경우에 피승수 X를 더하는 과정으로 구성되는데 Y비트 체크 때마다 X는 왼 쪽으로 한 비트씩 시프트됩니다.
2. 곱셈 프로그램 예시
한 번에 두 개의 숫자만을 더할 수 있으므로 중 간합을 저장하기 위하여 P를 따로 마련합니다. 그 중간합을 부분곱 (partial prod uct)이라고 부르며 이것은 처음에 0에서 시작됩니다. 피승수 X는 승수 Y의 각 비트 중에서 1인 경우만 P에 더해지고 각 비트를 체크할 때마다 X값은 왼쪽 으로 시프트됩니다. 따라서 P의 마지막 값이 두 수의 곱이 됩니다.
그림 6-3의 흐름도는 곱셈 동작의 프로그래밍에 대한 단계적 과정을 보여줍니다. 프로그램은 8번 되풀이하는 루프를 갖고 있고 처음에 X는 피승수, Y는 승수를 나타내며 카운터 CTR은 -8에 세트되고, P는 0에 세트됩니다. 승수의 비트는 E레지스터에 옮겨서 체크할 수가 있는데 이것은 E를 클리어 시킨 후 Y값을 AC에 로드시키고 E와 AC를 오른쪽으로 순환 (circulate) 시키 고나서 시프트된 숫자를 다시 Y에 저장함으로써 실행됩니다.
E에 저장된 이 비트는 승수의 하단부 비트인데 이것이 1이면 피승수 X는 부분곱 P에 더해져 0일 경우에는 부분곱은 변하지 않습니다. 그리고나서 X값을 AC 에 로드하여 E 와 AC 를 순환시킴으로써 X값을 왼쪽으로 시프트시킵니다. 루프는 CTR 을 0이 될 때까지 증가시켜서 8번을 반복하게 됩니다. 카운터가 0이 되면 P에는 곱의 결과가 저장되고 프로그램은 루프로부터 빠져나옵니다. 표 6-14에 있는 프로그램은 부호없는 두 개의 숫자를 곱하는 명령어들로서 초기 상태가 주어지지 않았지만 프로그램이 컴퓨터에 로드될 때에 포함되어져야 합니다. 초기 상태는 피승수와 승수를 각각 X와 Y에 옮기고 카운터에는 -8 을, 그리고 P에는 0을 세트함으로써 수행됩니다.
3. 배정밀도 가산
두 개의 16비트 숫자를 곱할 때, 결과는 32비트가 되어 두 개의 메모리 워드에 저장되어야 하는데 이와 같은 경우 배정밀도 (double-precision) 를 갖는다고 합니다. 부분곱이 계산될 때 배정밀도 숫자를 역시 배정밀도를 갖는 시프트된 피 승수와 더할 필요가 있습니다. 배정밀도 숫자 한 개는 두 개의 연속된 메모리 영역 AL과 AH에 놓여지고 다른 또하나의 숫자는 BL과 BH에 놓입니다.
표 6-15의 프로그램과 같이 두 개의 하단부 부분이 더해져서 그 캐리가 E에 저장된 후 AC가 클리어되고 AC의 최하단부로 순환되며, 그 다음에 두 개의 상단부 부분 이 캐리에 더해지고 배정밀도합이 CL과 CH에 저장됩니다. 논리 연산 기본 컴퓨터는 논리 연산을 위한 세 개의 기계 명령어, AND, CMA과 CLA가 있습니다.
4. LDA 명령어
LDA 명령어는 논리 피연산자를 AC에 옮기는 논리 연산으로 간주됩니다. 4-4절에서 나타난 16개의 논리 연산은 어떤 논리 연산이든 AND와 보수 연산을 이해하여 실행될 수 있기 때문에 소프트웨어에 의해서 실행될 수 있습니다. 예를 들어 OR 연산은 기본 컴퓨터의 기계 명령어로서 이용될 수 없지만 De Morgan 정리에 의해서 x+y=(x'y'관계를 이용함으로써 AND와 보수 연산 만으로 실행될 수 있습니다. 두 개의 논리 피연산자 A와 B의 OR 연산을 실행하는 프로그램은 다음과 같습니다.
5. 시프트 연산
시프트에는 순환 (circular) 시프트 외에 논리 시프트와 산술 시프트가 있는데 이러한 시프트들은 몇 개의 명령어를 가지고 프로그램될 수 있습니다. 논리 시프트는 끝부분에 0이 삽입되는데 이것은 E를 클리어한 후 AC 와 E 를 순환시킴으로써 쉽게 실행할 수 있습니다. 따라서 오른쪽 논리 시프트를 위해서는 다음과 같은 두 개의 명령어가 필요합니다. CLE CIR 마찬가지로 왼쪽 논리 시프트는 CLE CIL 산술 시프트는 음수의 표현 방식에 따라 다른데 부호화된 2의 보수 표현을 사용한다면 4-6절의 표 4-7에 기재된 방식에 따라서 최좌단의 부호 비트는 변화하지 않고 부호 비트가 숫자의 상단 비트 부분으로 시프트됩니다. 오른쪽 산술 시프트에 대한 프로그램은 E를 부호 비트와 같은 값으로 세트한 후 오른쪽으 로 순환합니다.
왼쪽 산술 시프트에서는 최하단에 삽입되는 비트는 0입니다. 이것은 E를 클리어 한 후 왼쪽으로 순환 동작을 실행하면 되고 부호 비트는 변화하지 말아야 됩니다. 순환 명령어에서 부호 비트는 E로 옮겨지며 동작 후에 E의 값과 부호 비트가 비교되어서 일치하면 산술 시프트는 정확히 실행된 것이고, 다르면 오버 플로가 발생한 것입니다. 오버플로는 시프트되지 않은 숫자가 너무 크다는 것을 의미하며 2를 곱했을 때(시프트에 의해서) 그러한 숫자는 AC의 용량을 초과하게 됩니다.
댓글