리그캣의 개발놀이터

컴퓨터 구조론 3장 연습문제 풀이 본문

프로그래밍 기본/컴퓨터 구조론

컴퓨터 구조론 3장 연습문제 풀이

리그캣 2018. 1. 21. 17:02

컴퓨터 구조론 3장 연습문제 풀이


3.15부호 없는 2진수들 간의 곱셈 (1001X0111)이 수행되는 과정을 그림

3-13과 같이 작성하라.

C A Q

[초기 상태] 0 0000 0111

[사이클 1] 0 1001 0111;Q(0)=1이므로 A<-A+M

0 0100 1011 ;우측 쉬프트(C-A-Q)

[사이클 2] 0 1101 1011 ;Q(0)=1이므로 A<-A+M

0 0110 1101 ;우측 쉬프트(C-A-Q)

[사이클 3] 1 0011 1101 ;Q(0)=1이므로 A<-A+M

0 1001 1110 ;우측 쉬프트(C-A-Q)

[사이클 4] 0 0100 1111 ;Q(0)=0이므로 우측쉬프트

 

3.16 2의 보수로 표현된 5-비트 데이터 간의 곱셈 (10101X01101)이 Booth 알고리즘으로 수행되는 과정을 실제 프로그래밍으로 구현해보아라.

 


Booth's Algorithm[출처:Lecture2_BinaryMultiplication.pdf]

 

 

 

위에 알고리즘에서 알 수 있다 시피 C로 프로그래밍 하기 위해서는 M레지스터 Q레지스터 A레지스터가 필요하다. M레지스터는 피승수를 저장할수 있어야 하며, A레지스터는 초반부에 00000으로 세트 되어있어야 한다. 또 Q레지스터는 총 6비트가 필요한데 Q(-1)에는 0으로 세트 되고 나머지는 승수가 세트되어야 한다. 그리고 5비트임으로 Count는 5가 되어야 한다.

 

int main()

{

char A[5]={0,0,0,0,0}, Q[6]={0,1,1,0,1,0};

char M[5]={1,0,1,0,1};

int Count = 5;

}

 

본문으로 들어가게 되면 for문이 필요하다 c이는 Count에 따라서 돌려야 되기 때문이다.

for(Count;Count>=0;Count--)

{

}

그리고 for 문안에서 Q(0),Q(-1) 이 01,10,00,11 인 경우의 세 가지로 나누어지는데 Q(0)과 Q(-1)이 일치하면 산술적 우측 쉬프트만 쓰여지게 되고 일치하지 않으면 두가지 경우로 나누어 질수 있다.

if(Q[4]==1&&Q[5]==0)//Q(0),Q(-1) = 10 이면

{

SETA=Binary_To_Decimal(A); //A를 10진수로 변환 후 SETA에 저장

SETM=Binary_To_Decimal(M);//M을 10진수로 변환 후 SETM에 저장

SETA=SETA-SETM;//A-M을 실행

*A=Decimal_To_Binary(SETA);//다시 A레지스터에 A-M의 2진수 저장

 

}

else if(Q[4]==0&&Q[5]==1)//Q(0),Q(-1) = 01 이면

{

SETA=Binary_To_Decimal(A); //A를 10진수로 변환 후 SETA에 저장

SETM=Binary_To_Decimal(M);//M을 10진수로 변환 후 SETM에 저장

SETA=SETA+SETM;//A+M을 실행

*A=Decimal_To_Binary(SETA);//다시 A레지스터에 A+M의 2진수 저장

}

int Binary_To_Decimal(char *);//2진수를 10진수로 변환 시켜주는 함수

char Decimal_To_Binary(int );//10진수를 2진수로 변환 시켜주는 함수

자 이제 산술적 우측 쉬프트만 시켜주면된다.

Q[5]=Q[4];Q[4]=Q[3];Q[3]=Q[2];Q[1]=Q[0];

Q[0]=A[4];A[4]=A[3];A[3]=A[2];A[2]=A[1];A[1]=A[0]; //A[0]은 그대로 둔다.

 

 

3.20 아래의 10진수들을 IEEE754표준 32-비트 부동소수점 형식으로 표현하라.

 

(1) 5(10)= 101(2) = 1.01X2^2

부호(S)비트 = 0(+)

지수 E = 00000010+01111111(바이어스127을 더한다.)

=10000001

가수 M = 01000000000000000000000

S

E

M

0

10000001

01000000000000000000000

(2) 253.25(10)= 11111101.01(2) = 1.111110101X2^7

부호(S)비트 = 0(+)

지수 E = 00000111+01111111(바이어스127을 더한다.)

=10000110

가수 M = 11111010100000000000000

S

E

M

0

10000110

11111010100000000000000

 

(3) -1.625(10)= 1.101(2) = 1.101X2^0

부호(S)비트 = 1(-)

지수 E = 00000000+01111111(바이어스127을 더한다.)

=01111111

가수 M = 10100000000000000000000

S

E

M

1

01111111

10100000000000000000000

 

(4) -1/32(10)= 0.03125(10) =0.00001(2) = 1X2^-5

부호(S)비트 = 1(-)

지수 E = 11111011+01111111(바이어스127을 더한다.)

=11110100

가수 M = 00000000000000000000000

S

E

M

1

11110100

00000000000000000000000

 

3.23 아래의 부동소수점 산술 연산들을 수행하라. 단, 연산을 수행한 후에는 반올림을 이용하여 결과값의 소수점 아래 6자리까지만 남기도록 하라.

(1) (0.111001X2^-5)+(0.100111X2^-3)

(1) 지수 조정 (0.00111001X2^-3)+(0.100111X2^-3)

(2) 더하기 0.11010101X2^-3

(3) 정규화 하기 0.11010101X2^-3

(2) (0.100011X2^6)-(0.111001X2^3)

(1) 지수 조정 (0.100011X2^6)-(0.000111001X2^6)

(2) 빼기 0.011110111X2^6

(3) 정규화 하기 0.11110111X2^5

(3) (0.1001X2^8)X(0.1011X2^12)

(1) 가수 곱하기 (0.1001)X(0.1011)=0.1100011

(2) 지수 더하기 8+12=20

(3) 정규화 하기 0.1100011X2^20

Comments