컴퓨터구조

[컴퓨터 구조] 어셈블리어 예제 (Symbolic program to Add 100 Numbers, Subtract Two Numbers,Multiply two positive Numbers)

유노brain 2023. 10. 13. 02:43
반응형

기본적인 Instruction (외우기)

 

1번 두 숫자 빼기(Subtract Two Numbers)

정답 코드

풀이 방법

컴퓨터는 빼기를 하지 못한다.

그렇기 때문에 두 숫자를 빼는데 필요한 지식은 2의 보수이다.

즉 위의 경우 MIN - SUB를 진행하기 위해서는 SUB를 2의 보수를 해야한다.

코드 설명

ORG 100 : 프로그램 시작 위치를 100으로 지정하였다. 즉 LDA 위치 100부터 END 108까지 진행된다.

 

LDA SUB : DEC -23를 가져온다. LDA는 AC ←M [AR] ( DR ← M [AR],  AC ← DR)

 

CMA : AC의 정보를 complement 한다.(1의 보수로 변한다.)

 

INC : AC ←AC + 1 즉 1을 더함으로 2의 보수로 만든다.

 

ADD MIN : MIN에 해당하는 숫자 83을 AC에 저장되어 있는 -23의 2의 보수형태와 더한다.

(여기서 ADD 자체가 DR ←M[AR]이기 때문에 굳이 LDA MIN을 해줄 필요가 없다.)

 

STA DIF : DIF에 AC 값을 저장한다. (M [AR] ← AC)

 

HLT : 계산 종료

 

위의 HLT 까지가 machine instruction이 된다.

 

나머지 아래는 Pseudo instruction이 된다.

 

2번 두 양수 곱하기(8bit)

정답 코드

풀이 방법

두 수의 곱하기의 경우 비트 이동으로 설명을 할 수 있다.

아래는 예시 방법이다.

여기서 P를 보면 옆에 X, Y의 곱하기를 하고 나온 후의 값들을 더한 것을 알 수 있다.

아래는 위를 풀기 위한 flowchart이다.

8비트 X, Y의 곱하기 때문에 총 8번 반복하게 된다.

 그렇기 때문에 CTR ← -8로 설정한 것이다.

시작 P도 0이므로 P ← 0으로 설정한다.

그다음 E(Cout)수가 없으므로 0으로 clear 해줘야 한다.

Y값을 AC에 넣은 후 cir(오른쪽) 쉬프트를 해준다. 

그다음 AC를 쉬프트한 값을 Y에 전송한다.

이제 쉬프트를 통해 생긴 E를 판단을 한다. 

만약 E=1이라면 위의 P 그림처럼 P ← P + X를 해줘야 하고 그 후 E ← 0으로 clear 해줘야 한다.

E = 0이라면 다음 단계로 넘어가면 된다.

이제 X를 AC에 넣고 왼쪽으로 쉬프트 한다.

그다음 쉬프트한 AC를 A에 전송을 하고 이제 한번 반복이 끝났으므로 CTR ← CTR +1을 진행한다.

쉬프트 하고 남은 E의 값에 따라 0이 아니라면 반복을 하고 0이면 Stop 한다.

 

코드 설명

ORG 100 : 프로그램 시작을 100번지에서 시작해라

 

LOP,  CLE : 나중에 LOP라는 기호가 오면 다시 돌아오는 곳으로 E를 Clear를 해준다.

 

LDA Y : AC ←M [Y]를 진행한다. 

 

CIR : 오른쪽으로 비트를 옮기며 AC(15) ←E, E ← AC(0)이 된다.

(위의 X,  Y 예시에서는 처음으로 진행하는 것이라면 E ← 1이 된다.)

 

STA Y : CIR를 진행한 후 AC값을 Y에 저장한다.

 

SZE : E의 값이 0이면 BUN ZRO부분으로 만약 E의 값이 1이면 BUN ONE을 실행한다.

( if E= 0 then PC ← PC +1 이기 때문이다.)

 

BUN ONE : E = 1에 해당이 된다면 ONE의 위치로 간다.

 

BUN ZRO : 마찬가지로 E = 0이 된다면 ZRO의 위치로 간다.

 

ONE,  LDA X :  AC ← M [X]를 진행한다.

 

ADD P : P에 X를 더한다.

 

 STA P : 더한 값을 AC에 저장한다.

 

CLE : E를 clear를 한다 E ← 0

 

ZRO,  LDA X :  AC ← M [X]를 진행한다.

 

CIL : 왼쪽 쉬프트를 진행한다. AC(0)   E, E    AC(15)가 된다.

 

STA X : 쉬프트 한 값을 AC에 다시 저장한다.

 

ISZ CTR : CTR를 증가시키는데 CTR 값이 0이면 PC PC+1을 진행한다. 즉 HLT로 간다.

 

BUN LOP : CTR값이 1이라면 다시 LOP가 있는 100번지 LOP,  CLE가 있는 곳으로 간다.

 

HLT : 종료이다.

 

여기까지가 machine instruction이다.

아래부분은 Pseudo instruction이기 때문에 읽는 것만으로도 충분하다.

 

3번 아래의 코드를 assembly로 작성하시오

#include <stdio.h>

int main() {
    int A[100];
    int SUM = 0;

    for (int J = 0; J < 100; J++) {
        SUM = SUM + A[J];
    }
    return 0;
}
정답 코드

풀이 방법

먼저 필요한 것부터 나열해 보자

배열이 들어가 있으므로 pointer 공간이 필요할 것이다.

반복문이 1부터 100까지 100번 반복하기 때문에 이것을 나타낼 수 NBR = -100이라고 정의하자

SUM을 받을 곳을 만들자

 

코드 설명

ORG 100 : 프로그램 초기위치를 100번지로 설정한다.

 

LDA  ADS : ADS를 Load 한다. AC ← M [150]가 된다.

 

STA  PTR : PTR도 똑같이 150을 저장한다. (AC ← DR (150) 이기 때문)

 

LDA NBR : -100을 Load 한다. AC ← M [-100]

 

STA CTR : CTR에 -100을 저장한다.

 

CLA : AC ← 0으로 clear 한다.

 

LOP,  ADD PTR I : I(indrect) 즉 간접주소로 가서 더하라는 의미이다. 

(처음의 ㅣ경우 ORG 150번지로 가서 75를 더한다.)

 

ISZ PTR : pointer를 증가시킨다. 만약 pointer가 0이 된다면 PC ← PC+1 (pointer ←0이 될 리가 없지만...)

(처음의 경우 DR ← 150 + 1이 된다.)

 

ISZ CTR : CTR를 증가시킨다. 만약 CTR이 0이 된다면 PC ← PC+1을 통해 바로 STA SUM으로 간다.

 

BUN LOP : CTR이 0이 되지 않았다면 LOP지점 LOP,  ADD PTR I 부분으로 돌아간다.

 

STA SUM : SUM을 AC에 저장한다.

 

HLT : 끝낸다.

 

마찬가지로 여기까지가 machine instruction이고

아래의 경우  Pseudo instruction 이므로 읽어보면 될 것이다.

 

여기서 주의해야 하는 것은 위의 machine instruction부분의 지점이  Pseudo instruction 지점과 겹치면 안 된다.

즉 location을 충분히 크게 주어 두 명령어 코드의 위치가 겹치는 부분이 없어야 한다.

 

 

반응형