티스토리 뷰

[전광성의 어셈블리어 이해하기:1회] 어셈블리어를 배우기 위한 기본개념 (2)
저자: 전광성 |  날짜: 2004년 11월 17일  

/
1 .0 어셈블리어를 배우기 위한 기본개념 (1)
0 어셈블리어를 배우기 위한 기본개념 (2)
3 .0 어셈블리어를 배우기 위한 기본개념 (3)
/
  • 이진수로 나타낸 부호없는 정수

    자, 이제 이진수를 이용하여 자료를 표현해 보자. 우선은 제일 쉽고 간단하면서도 흔한 부호없는 정수에 대해 생각해보자. 부호없다는 것은 ‘음이 아닌 정수’라는 뜻이다. 그럼 음수는?... 다음 단락에서 다룰 것이니 걱정마라.

    우선은 2진수를 어떻게 10진수로 변환하는지 알아보자. ㅁㅁㅁㅁ ㅁㅁㅁㅁ 이렇게 8비트의 이진수가 있다고 하자. 아까 비트에 번호붙였던 것이 기억나는가? 8비트니까 맨 왼쪽이 비트7, 맨 오른쪽이 비트 0이다. 10진수로 변환하려면

    비트7 * (2의7승) + 비트6 * (2의 6승) + 비트5 * (2의 5승) + 비트6 * (2의 6승) + ... + 비트1 * (2의 1승) + 비트0 * (2의 0승)

    이렇게 하면 된다. 그런데 가만보자... 비트0이든 비트1이든 한 비트는 0 아니면 1이다. 그럼 조금 바꿔서 생각하면... 비트가 1인 자리수만 더해주면 된다. 0은 뭘 곱해도 0이 될테니까 덧셈에 아무런 도움을 주지 않을 것이다. 그렇다면 아예 (2의 □승)에 대한 표를 만들고 그것을 보고 변환하는 게 편할 것이다. 하지만 굳이 표를 그리진 않겠다. 왜냐하면 별 쓸모가 없기 때문이다.

    2진수는 너무 공간을 많이 차지해서 대부분 16진수로 변환해서 사용한다. 16진수는 또 무엇일까? 후에 설명하도록 하겠다. 일단은 진법을 변환하는 개념에 대해서만 알면 된다.

    이번엔 역으로 10진수를 2진수로 변환하는 방법을 알아보겠다. 방법을 직접 설명하기엔 너무 비효율적이므로 하나의 예를 들겠다. 37을 2진수로 표현해 보자.

    나눗셈나머지
    37 / 2 181
    18 / 2 90
    9 / 2 41
    4 / 220
    2 / 2 10
    1 / 2 01
    <표 2 : 10진수를 2진수로 변환하기>

    위에서부터 한줄씩 내려가며 계산한 것이다. 한번 계산했을 때의 몫이 다음 계산에서 이용된다. 몫이 0이 될때까지 반복한 후, 나머지를 맨 아랫줄에서부터 맨 위로 읽으면 된다. 따라서 100101(2) 가 된다. (뒤에 (2)는 이진수라는 뜻이다.)

    다음은 저장 크기다. 저장크기라고? 몇 자리, 즉 몇 비트로 숫자를 표현하느냐에 따라 얼마나 큰 숫자를 저장할 수 있는지가 달라질 것이다. 당연히 많은 자릿수, 즉 많은 비트로 숫자를 표현하면 더 큰 숫자를 표현할 수 있다. 인텔 CPU에서 사용할 수 있는 부호없는 정수의 저장 크기는 다음 그림과 표에 정리해 놓았다.


    <그림 1 : 데이터형과 그 크기>
    저장 종류(Type) 사용하는 비트수범위
    Unsigned byte
    8
    0~(2의8승 - 1)
    Unsigned word
    16
    0~(2의 16승 - 1)
    Unsigned doubleword
    32
    0~(2의 32승 - 1)
    Unsigned quadword
    64
    0~(2의 64승 - 1)
    <표 3 : 데이터형과 범위>

    조금 센스있는 분이라면, [2의 (사용하는 비트수)승] - 1은 해당 범위의 최대값이라는 것을 발견할 수 있을 것이다. 뒤에 왜 1을 빼는지는 범위가 0부터 시작한다는 데서 찾을 수 있을 것이다. 또 8비트가 1바이트라고 표에 나와 있으므로, 2바이트는 워드, 4바이트는 더블워드, 8바이트는 쿼드워드라는 것을 눈치채야한다.

  • 16진수 정수

    아까 알려주기로 했던 16진수에 대해 알아보자. 16진수는 0~9와 A~F까지의 16가지 문자를 이용하여 숫자를 표현하는 것이다. 각각 A는 10을, B는 11을, C는 12를, D는 13을, E는 14를, F는 15를 의미한다.

    10진수0123456789101112131415
    16진수
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    A
    B
    C
    D
    E
    F
    <표 4 - 16진수표>

    16진수를 왜 쓰는지 생각해 보자. 대답은 간단하다. 16진수는 2진수보다 더 짧은 길이로 큰 수를 표현할 수 있기 때문이다. 그럼 왜 10진수도 11진수도 12진수도 아닌 딱 16진수일까? 그것은 바로 2의 4승이 16이기 때문이다. 이해가 가지 않는가? 그럼 다음 예를 보아라.

    A6(16진수) = 1010 0110 (2진수)

    2진수에서 가운데 공백을 넣은 것은 네글자씩 끊어서 보기 편하게 하려고 한 것이다. A는 10을 나타낸다고 아까 말했다. 2진수에서 상위 네 비트를 10진수로 바꿔보자. 10이 된다. 아까 A가 1010과 같다는 뜻이 된다.

    뭔가 눈치를 챘을 것이다. 2진수에서 네 비트는 16진수 한 자리와 대응 된다. 마찬가지로 6은 0110과 같다. 그러면 이제 16진수를 왜 쓰는지 알 수 있을 것이다. 2진수와의 변환이 간편하다는 점이다. 그냥 네 비트씩 끊어서 16진수로 바꾸면 된다. 왜 그런지는 각자 생각해 보기 바란다.

    여기서 간단한 팁 한가지를 알려 주겠다. 8421코드라는 변환 방법인데, 알고 있으면 정말 편하다. 즉 이진수 네 비트가 있다고 할 때 상위 비트부터 하위 비트까지 8421이 하나씩 대응되는 것이다. 이진수 1111은 8 + 4 + 2 + 1이다. 1001은 8 + 1이다. 8421을 언제나 머릿속에 넣어두어라. 이진수를 보고 16진수로 바꿀 때, 8421코드를 이용하여 각각의 네 비트를 10진수로 만든 후 16진수로 바꿔라. 이진수에서 16진수로 바꾸기가 편해질 것이다.

  • 댓글
    안내
    궁금한 점을 댓글로 남겨주시면 답변해 드립니다.