[컴퓨터 구조] 어셈블리어 예제 (Symbolic program to Add 100 Numbers, Subtract Two Numbers,Multiply two positive Numbers)
기본적인 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을 충분히 크게 주어 두 명령어 코드의 위치가 겹치는 부분이 없어야 한다.