이해를 위해, 이진수 문장만 저장 가능한 레지스터가 십진수 숫자인 11을 저장하는 것을 예시로 설명하겠다
레지스터는 64개의 트랜지스터로 2의 64제곱 경우의 수만큼 이진수 문장을 만들 수 있다
트랜지스터의 표기법은 배치된 순서대로
63, 62, 61 ... 0 이렇게 번호를 붙이고 나열한다.
그리고 모든 트랜지스터에 0을 넣는다.
이제 11을 중복된 지수가 없는 2의 제곱들의 합으로 표현한다. 그 결과 8 + 2 + 1 = 2^3 + 2^1 + 2^0
이제 각 항의 지수와 같은 숫자를 가진 표기 번호의 트랜지스터의 값을 1로 바꾼다
3210 (트랜지스터 표기번호)
그 결과 1011 (트랜지스터 내부 값)이 된다
이때의 모든 트랜지스터를 표현하자면 아래와 같다

이런 방식으로 0과 2^63 사이의 모든 수를 표현한다.
그런데 트랜지스터를 수직으로 나열할 때도 있기 때문에 제일 왼쪽이나 오른쪽이라는 표현은 쓰지 않는다. 그래서 LSB(least siginificant bit)라는 용어로 번호가 0인 트랜지스터를 지칭하고, MSB(most significant bit)라는 용어로 번호 1인 트랜지스터를 지칭한다
또한 위 사진은 표기방법일 뿐이다. 보통 자주 쓰는 오른쪽의 몇자리를 제외한 나머지 0들은 굳이 적진 않는다
또한 사실 첫 상업용 컴퓨터의 기계어는 십진수 연산을 제공했다. 하지만 컴퓨터의 트랜지스터는 이진수만 씀에도 불필요하게 사람 때문에 십진수->이진수->십진수->이진수->십진수 ... 같은 과정을 반복해서 이것은 결국 비효율적이다는 것으로 증명되고 평소엔 이진수만 쓰고 입출력시에만 십진수로 변환하게 되었다.
부호는 어떻게 표현하는가?
사실 한 비트만 있어도 표현 가능한데 그 역할을 하는 비트가 왼쪽일 수도 오른쪽일 수도 있다
이것은 부주의한 프로그래머에게 오해를 줄 수 있다.
그래서 가장 왼쪽 값을 부호로 하기로 했다. 앞에 0들이 나오면 양수. 1들이 나오면 음수로 보는 것이다.
물론 이것도 문제가 하나 있다 0을 보수의 결과로 할때 -9223372036854775808과 대응되는 양수가 없다는 문제를 야기한다.
왜냐하면 이진수 문장이 전부 0인 경우가 1이 아니라 0을 표현해서 표현의 경우의 수를 하나 써버렸기 때문이다.
그리고 111 ... 1100은 -4이다. 왜냐하면 MSB가 0일땐 0부터 표현하지만, MSB가 1일땐 -1부터 표현해서 앞서나가기 때문이다.
그래서 이진수에서 양수를 음수로 바꿀 땐은
0과 1을 서로 바꾼 뒤에 양수 1을 더해서 값을 줄인다
바이트 적재 시의 두가지 표현 방식
우선 앞자리의 비트 값을 부호 비트값과 동일하게 하는 것을 부호확장이라고 한다.
RISC-V시의 1바이트 값(8개의 트랜지스터만 사용)의 적재 방식은 두가지로 나뉜다.
우선 lbu(load byte unsigned)는 바이트를 부호없는 수로 간주하고 남은 56비트를 0으로 채운다
반면 lb(load byte)는 부호있는 수로 간주하고 부호확장한 후에 값을 입력 받는다
'BackEnd > Computer Architecture' 카테고리의 다른 글
1.2.6 어셈블리어로 긴 수치와 주소를 쓰는 법 (0) | 2022.03.02 |
---|---|
1.2.5 어셈블리어로 문자와 문자열 사용해보기 (0) | 2022.02.27 |
1.2.4 어셈블리어로 프로시저 구현 (0) | 2022.01.18 |
1.2.3 어셈블리어 구현 (0) | 2022.01.07 |
1.2.1 어셈블리어 문법과 종류 (0) | 2022.01.02 |
댓글