CS/Computer Architecture

[컴퓨터구조] 6-3. Assembly Programs -1

F12:) 2023. 10. 9. 17:13

오늘은 어셈블리 언어로 작성된 프로그램들을 살펴봅시다. 그 중에서 오늘은 Loops, Multiplication, Arithmetic, Logic operation에 대해서 다뤄봅니다.

 


 

Program Loops

우리는 보통 같은 작업이지만 데이터가 다른 것들을 반복할 때, loop를 사용합니다. 그러면, 우리는 어셈블리 언어로 어떻게 작성할까요??

 

아래의 예시를 보시죠.

int[] A = new int[];
int sum = 0;

for(int i=0; i<100; i++) sum += A[i];

단순히 배열 A에 들어있는 값을 sum에 더하는 작업입니다. 이러한 loop가 어셈블리 언어로는 어떻게 작성되는지 한번 확인해봅시다.

 

실행 순서는 그대로 따라가보면 어렵지 않습니다. 100번지부터 시작하며, ADS를 PTR에 대입합니다. ADS는 메모리에 연속해서 위치해있는 배열의 첫번째 주소 값을 나타내고, PTR은 배열에서 가져올 메모리 주소를 의미합니다. 150부터 249까지 차례로 증가할 것입니다. NBR은 총 loop를 몇번 돌아야하는지를 나타내고, CTR은 그 중, 몇 번 돌았는지를 확인합니다. 따라서 CTR은 -100부터 0까지 진행될 것입니다. 만약 0을 만났다면 BUN LOP 즉, loop의 시작으로 다시 돌아가서 진행하는 과정을 skip하게 되고 sum에 해당 값을 저장합니다.

 

따라서 이러한 방식으로 SUM에 최종 덧셈값이 더해지게 됩니다.

 


 

Arithmetic Operations

컴퓨터는 machine instruction으로 구현되어있는 operations 즉, 하드웨어로 구현한 operation과, instruction set으로 구현된 software operation으로 나뉩니다.

 

지금까지 우리가 설계하고 있는 16비트 컴퓨터에는 기본적인 operation이 있습니다. add, sub, 등... 하지만 우리는 multiplication이 없습니다.

 

하드웨어적으로 곱셈 연산을 가지고있지 않다면 software로써 구현을 해야합니다. 따라서, 우리는 software로 multiplication 즉, 곱셈을 어떻게 진행하는지 확인해봅시다.

 

사실 곱셈은 우리가 세로식으로 직접 해온 방법과 유사합니다. 이러한 것이 비트 연산에서도 당연히 적용이 되니까요.

이러한 식에서, 우리는 매연산마다 Y의 가장 우측 비트만을 확인합니다. 그렇게 지금까지 진행해왔죠. 여기서는 더욱 간단하게, Y의 최하위 비트가 0인지 1인지를 판단하면 됩니다. 만약 0이라면 그냥 넘기고, 1이라면 X를 더해주는 방식이 되겠죠.

 

그럼 우리는 Y의 최하위 비트를 얻기 위해 shift 연산을 이용합니다. shift 연산을 이용하면 최하위 비트가 E 레지스터에 들어오게 되고 이 레지스터를 통해서 곱셈의 연산을 진행할 수 있습니다. 아래에는 그러한 곱셈 연산의 플로우 차트를 보여줍니다.

한가지 유의할 것은, 우리가 지금까지 배운 instruciton에는 shift가 없습니다. circular left, right만 있을 뿐이죠. 따라서 cil과 cir로 작성했다는 점을 알아두면 되겠습니다.

 

CTR이 0이면 최종적으로 마무리합니다. 그 전까지는 cir로 Y의 최하위 비트를 얻어 최종 결과인 P에 반영해주는 모습을 볼 수 있고, X는 한번의 loop 이후, cil을 통해서 한자리 올려주는 모습까지 확인할 수 있습니다.

 

이러한 플로우차트를 가지고 어셈블리 코드를 짜봅시다. 아래와 같이 나올 수 있을 것입니다.

 

그림에 설명을 적었으므로, 더 설명을 생략합니다.

 

 


 

Logic Operations

이제 Logic operation을 확인해봅시다. 다른 것들은 사실 기본적으로 instruction이 정의되어있기도 하고, 쉽게 나타낼 수 있습니다.

저희는 드모르간 법칙에 대해서 다뤄보겠습니다.

 

OR : x+y = (x'y')'

 

이런 식으로 표기할 수 있으므로, 아래와 같은 assembly program이 짜여집니다.

 


 

Shift Operations

앞에서, shift operation은 정의되지 않은 instruction이라고 하였습니다. 따라서 cir이나 cil같은 instruction을 사용하는데, 아래와 같이 나타낼 수 있습니다.

하지만 이것은 logical shift이고, arithmetic shift는 살짝 다릅니다.

arithmetic shift는 right shift만 고려하면 됩니다. right shift를 할 때, 만약 음수였는데 E가 0이여서 갑자기 양수가 되어버리는 경우가 있을 수 있기 때문이죠. 아래와 같이 프로그램을 작성하면 됩니다.


이렇게 이번 글에서는 어셈블리 언어로 작성된 여러 코드를 보았습니다. 다음 글에서는 오늘 다루지 못한 Subroutines와 I/O Programming에 대해서 다뤄보겠습니다.