[ASM] 컴퓨터 데이터 기초

👻 컴퓨터가 데이터를 저장하는 법

지난 시간에서 봤듯이 컴퓨터 구조는 크게 세 가지로 나뉜다. CPU, 레지스터, 메모리 이 세 부분이 끊임없이 데이터를 주고 받으며 실시간으로 변하는 값들을 처리한다. 이러한 데이터를 컴퓨터는 어떻게 처리를 하는 지 알아보도록 하자.


👻 비트와 바이트

컴퓨터가 처리하는 데이터의 단위엔 비트(Bit)바이트(Byte)가 있다.
Alt text
이전 시간에서 알 수 있었듯이 컴퓨터는 0과 1로만 이루어진 값으로 데이터를 처리한다.
전원이 꺼지면 0, 켜지면 1이라는 수를 가지게 되고, 1비트당 하나의 수만 담을 수 있다.
이러한 비트가 8개 모이면 1바이트가 된다.

💡
8 bits == 1 byte
16 bits == 2 bytes == 1 word
32 bits == 4 bytes == 2 words == 1 dword (double-word)
64 bits == 8 bytes == 2 words == 2 dwords == 1 qword (quad-word)


🌱 양수와 음수

양수는 이진수 그대로 표현하면 이상이 없다. 하지만 음수를 표현할 때에는 약간의 문제점이 발생하는데 아무래도 0과 1로만 표현하다보니 규칙을 따로 지정해두지 않으면 보기가 힘들지 않았을까 싶다.
Alt text
우선 컴퓨터 내에 기본으로 있는 계산기를 연 후에, 좌측 상단 세 줄을 클릭하면 계산기의 종류를 바꿀 수 있다.
나는 비트 공부를 위해 프로그래머용으로 바꿔주었다. 이렇게 보면 비트에 대한 개념 이해가 눈으로 한 눈에 보여서 좋다.

이제 1바이트 기준으로 보도록 하자. 앞서 말 한 것처럼 양수는 이진수로 바꾸는 데 크게 무리가 없다.
문제는 음수인데, 음수를 이진수로 바꾸려면 두 가지 단계 가 필요하다.

  1. 우선 음수의 절대값을 이진수로 바꿔준다.
  2. 바뀌어진 이진수의 0과 1의 값을 각각 반대로 전환시켜준다.
  3. 1을 더해준다.

위 단계에서 2번째를 거쳐 나온 이진수를 2의 보수(two’s complement)라고 한다.
위키를 찾아보니 어떤 수를 커다란 2의 제곱수에서 빼서 얻은 이진수라고 하는데 무슨 말인지는 나도 잘 모르겠다.
무튼 요약해보자면 2의 보수에 1을 더해서 음수↔양수를 오간다는 의미인데 처음에는 개념이 잘 안 잡힐지 몰라도 하다보면 개념을 터득하게 될 것이다.
깊이 알 필요는 없고 이렇게해서 바꿔진다 정도로만 알아둬도 될 것 같다.

예시) -24를 이진수로 바꾸고 싶어요.
1. 절대값인 24를 이진수로 변경 👉 0001 1000
2. 해당 값의 0과 1을 각각 반대로 전환 👉 1110 0111 (2의 보수)
3. 1을 더하기 👉 1110 1000 : "-24" 완성!!

연습을 좀 하다보면 음수값은 가장 최상위 비트가 1로 고정이 된다는 것을 알 수 있다.
고로 가장 최상위 비트는 해당 값의 부호를 나타내는 것으로 0이면 양수, 1이면 음수를 뜻하게 된다.


👻 ASM에서 데이터 갖고놀기

우선 우리가 주로 사용하는 수는 십진수로 표현된다.
컴퓨터는 이진수로 데이터를 인식한다. 1비트는 0과 1로만 이루어진 이진수로 표현되기 때문에 실습을 진행할 때 십진수 보다는 이진수로 진행하는 게 편리할 것이다. 하지만 이진수는 수가 커질수록 표시해야 되는 숫자도 많아진다는 단점이 있다.
사람 친화적인 십진수와 컴퓨터 친화적인 이진수의 절충안이라고 할 수 있는 수가 바로 16진수이다.
앞으로 예제는 대부분 16진수로 진행이 될 것 같다.

십진수 : 0 1 2 3 4 5 6 7 8 9 10 11 12 …
이진수 : 0 1 10 11 100 …
16진수 : 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 …

이렇게 보니 이진수와 16진수는 0과 1로만 이루어져있을 때를 보면 구분하기 쉽지 않다.
그래서 코드를 작성할 때는 이진수 앞엔 0b(Binary)를, 16진수 앞엔 0x(Hexa)를 붙이게 된다. 십진수는 따로 무언가를 붙이진 않는다.

예시
이진수 : 0b0 0b1 0b10 0b11 0b100
16진수 : 0x00 0x01 0x02 0x03 0x3A

추가로 이진수와 16진수 사이의 변환은 매우 간편하다.

이진수를 네 자리씩 끊어서 변환해주면 된다!
예시) 0b 1001 0101 = 0x95 = 149


👻 글을 마치며

처음엔 이진수, 십진수, 16진수를 오고가고 전환하는 게 쉽지 않았었는데 그래도 계속 보다보니 계산이 좀 되는 것 같다. 앞으로 보자마자 전환이 가능할 정도로 익숙해져야겠다. 굿 ‘-‘b


출처
인프런 Rookies님 강의

Leave a comment