- 면접관 : "흠흠.. 머리숱이 아주 많은 지원자시군요...(부럽) 그럼 ALU가 무엇인지 간단하게 설명해주시겠어요?"
- DAELEE : "아 넵! ALU는...
[문제2]
'mihykim'은 ALU 구성요소 학습을 마치고 그 내용을 블럭으로 가지런히 정리해두었습니다. 그런데 월요일 아침, 주말에 다녀간 조카가 블럭을 다 빼놓은 것을 발견했습니다. 당황한 'mihykim'을 도와 블럭순서를 바르게 맞춰주세요.
<블럭>
[ 보수기(complementer) ]
[ 시프트 레지스터 ]
[ 논리연산장치(LU) ]
[ 산술연산장치(AU) ]
[ 상태 레지스터 ]
- 산술 연산(+, -, X, %)을 수행하는 장치 :
[ ]
- 논리 연산(&, |, ^, !)을 수행하는 장치 :
[ ]
- 비트들을 좌측 혹은 우측으로 이동시켜주는 레지스터 :
[ ]
- 데이터에 2의 보수를 취해주는 요소 :
[ ]
- 연산 결과의 상태를 나타내는 플래그들을 저장하는 레지스터 :
[ ]
[문제3]
컴퓨터구조 스터디원들은 ALU 상태레지스터 내 '상태 플래그'에 대해 서로 공유하기로 하였습니다. 다음 내용 중 사실과는 다른 내용을 이야기하는 사람은 누구일까요? (복수 정답)
'gaekim' : 프로세서 설계에 따라 상태 플래그의 구성과 그 기능이 약간씩 다를 수 있대요.
'sancho' : 맞아요. 일부 아키텍처에서는 상태 레지스터가 아예 없기도 한가봐요. 그럼 주로 쓰이는 플래그들을 말해볼까요?
'hylee' : (스읍-) 음... 일단 제로 플래그(Z)가 있겠어요. 연산의 결과가 0일 경우에 참이 되지요.
'kycho' : 아, 제로플래그는 리버스 엔지니어링에서 구조를 추적하는데 매우 중요한 플래그라고 하네요.
'jakang' : 비슷하게 연산의 결과가 음수일 때 참이되는 네거티브 플래그(N)도 있어요.
'yeosong' : unsigned 숫자의 연산결과가 비트 범위를 넘어설 때 필요한 플래그도 있어요.
'jehong' : 캐리 플래그(C) 말씀하시는거죠? 처음엔 오버플로우 플래그(O)랑 헷갈렸는데 알아보니 아예 똑같은 것 같더라구요.
'taelee' : 와 다들 잘 알고 계시네요. 인터럽트 요구를 받아들일지 말지 결정하는 인터럽트 플래그(I)도 있습니다!
- 4비트 ALU 중 하나인 인텔 74181은 약 70개의 논리게이트를 사용했고 곱셈과 나눗셈은 할 수 없었다.
- 8비트 ALU를 완전히 구축하려면 수백개의 논리게이트가 필요하다.
- 수 백개의 논리게이트를 다 표현하려면 너무 복잡하니까 아래와 같은 다이어그램으로 ALU를 추상화해서 표현한다.
📄 답지
- 면접관 : "흠흠.. 머리숱이 아주 많은 지원자시군요...(부럽) 그럼 ALU가 무엇인지 간단하게 설명해주시겠어요?"
- DAELEE : "아 넵! ALU는
CPU의 주요 구성요소 중 하나로, Arithmetic Logic Unit이라는 이름 그대로 산술논리연산장치를 말합니다. 덧셈뺄셈과 같은 산술연산과 AND, OR와 같은 논리연산을 수행하는 핵심적인 회로입니다.
"
[문제2]
'mihykim'은 ALU 구성요소 학습을 마치고 그 내용을 블럭으로 가지런히 정리해두었습니다. 그런데 월요일 아침, 주말에 다녀간 조카가 블럭을 다 빼놓은 것을 발견했습니다. 당황한 'mihykim'을 도와 블럭순서를 바르게 맞춰주세요.
- 산술 연산(+, -, X, %)을 수행하는 장치 :
[ 산술연산장치(AU) ]
- 논리 연산(&, |, ^, !)을 수행하는 장치 :
[ 논리연산장치(LU) ]
- 비트들을 좌측 혹은 우측으로 이동시켜주는 레지스터 :
[ 시프트 레지스터 ]
- 데이터에 2의 보수를 취해주는 요소 :
[ 보수기(complementer) ]
- 연산 결과의 상태를 나타내는 플래그들을 저장하는 레지스터 :
[ 상태 레지스터 ]
[문제3]
컴퓨터구조 스터디원들은 ALU 상태레지스터 내 '상태 플래그'에 대해 서로 공유하기로 하였습니다. 다음 내용 중 사실과는 다른 내용을 이야기하는 사람은 누구일까요? (복수 정답)
'jehong'
캐리 플래그(C) 말씀하시는거죠? 처음엔 오버플로우 플래그(O)랑 헷갈렸는데 알아보니 확실히 다른 것이더라구요.
캐리 플래그는 최상단 비트에서 자리올림 발생 시 Set되고
오버플로우 플래그는 최대 표현 범위를 넘어섰거나, 같은 부호를 더했는데 다른 부호가 나와버릴 때 Set 된답니다.
예를 들어 1000 + 1000 => 10000 에서는 캐리 플래그가,
0111 + 0001 => 1000 에서는 오버플로우가 Set됩니다. (7 + 1 => -8)
'taelee'
와 다들 잘 알고 계시네요!
지금까지는 상태플래그를 이야기했는데 상태레지스터에는 CPU를 제어하기위해 사용되는 제어플래그(Control flag)도 있답니다.
그 예로 인터럽트 요구를 받아들일지 말지 결정하는 인터럽트 플래그(I)가 있습니다!
-
n비트 조합에서 의미있는 조합의 개수 : 2^n
- 3bit 라면 000, 001, 010, 011, 100, 101, 110, 111 총 8개의 조합이 가능함.
-
n비트에서 표현 가능한 10진수 범위 : 0 ~ 2^n - 1
-
n비트로 표현된 2진수를 10진수로 변환하는 일반식
-
Bit Extension 방법 : 상위(좌측) 남는 비트부터 0추가
- 8비트를 16비트에 저장헤야할 때
- 57(10) = 00111001(8), 0000000000111001(16)
-
아래와 같이 부호화-크기(signed-magnitude representation)로 표현된 수들을 10진수로 변환하세요.
- 0 0110101 =
- 1 0110101 =
- 1 000 =
-
부호화-크기 표현의 가장 큰 단점 두 가지를 설명해주세요.
-
1의 보수 표현(1’s complement representation)의 음수화(negation) 방법을 설명해주세요.
-
2의 보수 표현(2’s complement representation)의 음수화(negation) 방법을 설명해주세요.
-
2의 보수로 표현된
10111010
을 10진수로 변환하세요.
📄 답지
-
아래와 같이 부호화-크기(signed-magnitude representation)로 표현된 수들을 10진수로 변환하세요.
- 0 0110101 =
- 1 1010101 =
- 1 000 =
정답 :
- 0 0110101 = 1 * (1x2^5 + 1x2^4 + 1x2^2 + 1x2^0) = (32 + 16 + 4 + 1) = 53
- 1 1010101 = -53
- 1 000 = 0
-
부호화-크기 표현의 가장 큰 단점 두 가지를 설명해주세요.
정답 :
- n비트 조합에서 의미있는 조합의 개수 : 2^n 가 아니라 2^n - 1 이다. 부호화-크기 표현에서는 1000(2)과 0000(2) 둘 다 0을 표현하므로 하나의 조합을 낭비하게 된다.
- 계산을 수행할 때 부호비트와 크기 부분을 별도로 처리해야한다. 크기 부분만 따로 계산한 뒤 크기 부분의 절댓값이 더 큰 수의 부호를 결과값의 부호로 세트해야함. 귀찮음.
-
1의 보수 표현(1’s complement representation)의 음수화(negation) 방법을 설명해주세요.
정답 : 모든 비트들을 반전한다. (0 -> 1, 1 -> 0)
- 1의 보수 표현에서 Bit Extension은 Sign Bit 다음에 Sign Bit와 같은 수를 추가하는 방식으로 이루어진다.
- 그러나 여전히 0에 대한 표현이 두 가지이므로 조합의 낭비가 발생한다. 그래서 일반적으로 컴퓨터는 2의 보수 표현법을 더 많이(아니 거의 100%) 사용한다.
-
2의 보수 표현(2’s complement representation)의 음수화(negation) 방법을 설명해주세요.
정답 : 모든 비트들을 반전하고, 결과값에 1을 더한다.
1을 더함으로서 조합의 개수를 낭비하지 않게 되었다! 2의 보수 표현에서는 음수0이 사라진 대신, 음수0은 절대값이 가장 큰 음수와 매핑된다. 예를 들어, 100(2)은 부호화-크기 표현에서 음수 0이었지만, 2의보수 표현에서는 -4다.
-
2의 보수로 표현된
10111010
을 10진수로 변환하세요.정답 : -70
방법1. 책 145p 예제(3-4) 일반식 참고
- -128 + (1x2^5 + 1x2^4 + 1x2^3 + 1x2^1) = -128 + (32 + 16 + 8 + 2) = -70
방법2. 책 146p 예제(3-6) 참고
- 10111010 - 1 한 뒤 => 10111001
- 0은 1로, 1은 0으로 바꿔주기 => 01000110
- 10진수로 변환하고 - 부호 붙이기 => -70
📄 답지
-> 선택적 세트 연산은 어떤 레지스터의 특정 비트들을 1로 세트하려고 할 때 쓰이는 연산으로 A레지스터의 바꿀 비트 위치에 1을 세트하고 OR연산을 수행합니다.
-> 11110000, 상위 4비트인 앞 네자리에 1로 세팅하여 A레지스터에 선택적 세트 연산을 적용하게 됩니다.
-> 선택적 보수 연산은 레지스터의 특정 비트들을 보수화하기 위한 동작이며 바꿀 A레지스터에 반전시킬 비트 위치에다 1을 세트하고 XOR연산을 수행합니다.
-> 11111111, 모든 위치에 1을 세트하여 A레지스터에 선택적 보수 연산을 적용하게 됩니다.
-> 마스크 연산은 데이터 내 특정 비트들의 값을 0으로 리셋시키기 사용하며, 바꿀 A레지스터에 대응되는 비트 위치에 0으로 세트하고 나머지 위치에 1을 세트한 후 AND 연산을 수행합니다.
-> 01100110, 같은 자리에 하나씩 비교하며 XOR연산을 진행하면 A레지스터의 값이 다음과 같이 바뀌게 됩니다.
(보기 편하도록 4비트마다 띄어서 표기하겠습니다)
- 논리적 우측 시프트 하면?
- 논리적 좌측 시프트 하면?
- 순환 우측 시프트 하면?
- 순환 좌측 시프트 하면?
- 산술적 우측 시프트 하면?
- 산술적 좌측 시프트 하면?
📄 답지
앞부분 설명은 맞는데, 곱하기 2한 값이 됩니다. 예를 들면 0010 (2) -> 0100 (4)
(보기 편하도록 4비트마다 띄어서 표기하겠습니다)
산술적 우측 시프트는 부호비트를 복사해서 오른쪽으로 가죠!
1010 1101 를 ASR하면
1101 0110. 얘를 한 번 더 ASR하면
1110 1011이다. 그래서 정답은
1110 1011
최상위의 0이 최하위로 가서 1011 0110
SHRC = Shift Right with Carry
캐리 플래그 1, 0101 1011에서 캐리 플래그의 값이 최상위 비트에 저장되니까 답은 1010 1101.
RLC = Rotate Left with Carry
0 0101 1011 에서 한 번 하면
0 1011 0110 , 여기서 한 번 더 하면
1 0110 1100
- 논리적 우측 시프트 하면?
0110 1001
- 논리적 좌측 시프트 하면?
1010 0100
- 순환 우측 시프트 하면?
0110 1001
- 순환 좌측 시프트 하면?
1010 0101
- 산술적 우측 시프트 하면?
1110 1001
- 산술적 좌측 시프트 하면?
1010 0100
1011 0011을 논리적 우측 시프트 하면 (부호비트 복사 안하고 남는 거 버리고)
0101 1001 그걸 순환 좌측 시프트 하면 (남는 거 순환 시키고)
1011 0010 그걸 산술적 우측 시프트 하면 (부호비트 복사하고, 남는 거는 버리고)
1101 1001 이걸 산술적 좌측 시프트 하면 (한 칸씩 좌측으로 밀고 남는 거는 버리고)
1011 0010
SHRC
: C플래그의 값이 최상위 비트로 이동하고, 남는 건 버린다.
우측이니까 0 1011 0011에서 0 0101 1001
SHLC
: 최상위 비트가 버려지지 않고 C플래그에 저장되고, 원래의 C플래그 값은 지워진다. 남는 건 버린다.
0 0101 1001에서 1회 하면 0 1011 0010.
여기서 한 번 더 하면 1 0110 0100.
답은 0110 0100
RLC
: 최상위 비트가 버려지지 않고 C플래그에 저장되고, 원래의 C플래그 값은 지워진다. 남는 건 순환
1 1011 0011 -> 1 0110 0111
1 0110 0111
RRC
: C플래그의 값이 최상위 비트로 이동, 남는 건 순환
위의 값인 1 0110 0111에서
-> 1 1011 0011
-> 1 1101 1001
1 1101 1001