숫자가 먼저입니다.
어셈블리보다 숫자가 먼저 태어났지요. 수는 모든 만물의 원리라고 피타고라스도 말했습니다. 당연히 컴퓨터도 숫자로 돌아갑니다. 수학자들이 컴퓨터라는 시스템을 생각해낸게 이상하지 않지요.
왜 컴퓨터가 숫자로 이루어졌는지는 점점 자연스럽게 알게됩니다. 지금은 일단 어셈블리 언어에 사용하는 2진수와 16진수를 알아보겠습니다. 2진수 16진수를 알아야 어셈블리 언어를 입력하고 이해할 수 있습니다. 일단 emu8086 화면에 나오는 모든 숫자가 16진수이기 때문에라도 16진수가 뭔지 알아야합니다.
우리는 10진수를 씁니다. 0부터 9까지의 숫자 표기를 이용해서 수를 표현합니다. 이 숫자를 여러개 붙여서 특정한 값을 표현합니다. 예를 들어 754는 각 자리마다 10의 지수승으로 이루어져있습니다.
7 * 10^2 + 5 * 10^1 + 4 * 10^0
7은 10의 제곱승, 5는 10의 1승, 4는 10의 0승입니다. 10의 0승은 1이고요.
만약에 자리가 바뀌면 완전히 다른 숫자가 됩니다. 574는 754가 아니지요.
컴퓨터는 전자적으로 2가지 상태를 가진 물질로 이루어져있습니다. 전자적인 신호가 있으면 1 없으면 0의 상태를 가진 물질입니다.(주1) 그래서 0부터 9까지 10개의 숫자를 기억할 수 없습니다. 그래서 컴퓨터는 2진수를 사용하는 것입니다.
2진수란 수를 나타내는 숫자 표기가 2개인 것입니다. 0과 1입니다. 10진수는 열개의 숫자 표기가 있었지요.
2진수와 10진수를 구분하기 위해서 우리는 보통 2진수의 숫자 뒤에 b라고 씁니다. 영어로 2진수가 binary이기 때문입니다.
2진수의 수 10100101b는 10진수로 몇일까요?
10진수 754는 각 자리마다 10의 제곱승을 했습니다. 마찬가지로 2진수도 각 자리마다 2의 제곱승을 하면 됩니다. 가장 오른쪽은 2의 0승, 한칸 왼쪽은 2의 1승 이렇게 자리가 올라갈때마다 2를 곱하면 됩니다.
10100101b = 12^0 + 12^2 + 12^5 + 12^7 = 1 + 4 + 32 + 128 = 5 + 160 = 165
반대로 165를 2진수로 표현하려면 어떻게 해야할까요? 중고등학교 수학시간에 배웠듯이 2로 나눠서 나머지를 나열하는 방법도 있습니다. 그보다 저는 165와 가장 가까운 2의 제곱수를 생각하는 방법을 좋아합니다.
가장 먼저 165 = 128 + 37 라고 생각합니다. 128은 2^7인 것을 외우고 있기 때문입니다. 어셈블리 언어를 공부하다보니 2의 제곱수를 자연스럽게 많이 외우게 되었습니다.
165 = 2^7 + 37 이라면 그 다음으로 37 = 32 + 5 입니다. 32는 2^5 입니다. 그렇게 5도 4+1 이므로 2^2 + 1입니다. 결론은 165 = 2^7 + 2^5 + 2^2 + 2^0 입니다. 이걸 2진수로 바꾸는 방법은 제곱승의 숫자만큼 0을 붙이는 것입니다. 2^7은 0이 7개이므로 10000000b 입니다. 2^5는 0이 다섯개이므로 100000, 2^2는 100입니다. 다 더하면 10100101b 입니다.