티스토리 뷰

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

/
0 어셈블리어를 배우기 위한 기본개념 (1)
2 .0 어셈블리어를 배우기 위한 기본개념 (2)
3 .0 어셈블리어를 배우기 위한 기본개념 (3)
/
  • 시작하기에 앞서...

    어셈블리어는 저급언어다. 원론적으로 이야기 하자면, 사람보다는 기계에 더 친한 언어이다. 이 언어는 대부분 하드웨어에 직접 명령을 내리는 형식을 갖추고 있고, 고급언어에서 신경 쓰지 않아도 되었던 것들에 대해서 일일이 신경 써 주어야 한다. 그렇기 때문에 기본 개념이 필요하다.

    중학생 시절, 내가 C언어 책을 사서 공부하는 것을 보고 나의 친형이 경쟁심에 더 어려운 것을 해보겠다며 어셈블리어 책을 샀던 것이 기억난다. 형은 앞에만 조금 읽다가 재미없다고 책을 덮어버린 적이 있었다. 어셈블리어를 제대로 배워보겠다는 생각은 가져보았으나, 재미가 없어서 포기하는 경우가 많다.

    어셈블리어를 배우다가 가장 장애가 되는 것은 ‘이런 것을 내가 왜 배울까?’ 하는 생각일 것이다. 어셈블리어를 배운다는 것은 단지 언어를 배울 뿐만 아니라, 기초적인 컴퓨터 구조의 원리를 익히는 과정이다. 정 지루하다면, 다른 프로그래밍 언어를 어셈블리어로 구현할 때 어떻게 해야 할지 상상해 가며 강좌를 읽어주기 바란다. 물론 하드웨어를 하는 분이시라면 굳이 그런 의문이 없을 테지만.

    본 회에서는 매우 기본적인 개념을 다룬다. 컴퓨터관련 자격증 필기시험을 한번이라도 보았다면, 쉽게쉽게 이해할 수 있을 것이다. 그렇지 않더라도, 상식선에서 해결될 내용이니 걱정할 필요 없다. 부담없이 강좌를 봐주길 바란다.

  • 어셈블리어의 세계에 온 것을 환영합니다!

    어셈블리어란 기계어를 영문자로 치환시킨 언어이다. 예를 들어 45라는 명령이 있는데 이 명령이 숫자의 대소를 비교한다고 치자. 그렇다면 45라는 명령을 cmp와 같이 comparison의 약자로 대신 사용하는 것이다. 기본적으로 기계어는 모두 숫자이기 때문에 코드를 볼 때 이해하기도 힘들 뿐더러, 숫자로 된 그 많은 기계어들을 일일이 매뉴얼을 참고해 가며 프로그램 작성하기도 힘이 든다. 이런 불편함을 해소하고자 어셈블리어가 탄생하게 되었다.

    어셈블리어와 고급언어의 구체적인 차이는 <표1>에 설명해 놓았다.

    프로그램고급언어어셈블리어
    한 플랫폼에서만 돌아가는 대규모의 응용프로그램
    규모가 큰 코드를 유지 및 보수하기 좋은 구조를 갖고있다.
    코드의 유지보수가 어려운 구조를 갖고 있으며, 개발에 많은 경험을 필요로 한다.
    하드웨어 장치 드라이버
    직접적인 하드웨어 접근이 힘들다.
    하드웨어로의 접근이 직접적이고 간단하므로, 유지보수가 편하다.
    여러 플랫폼에서 작동가능한 응용프로그램
    보통 호환성이 뛰어나서, 약간의 코드 수정만으로 다른 플랫폼에 이식 가능하다.
    각각의 플랫폼마다 다른 어셈블러로, 다른 문법으로 작성해야한다.
    직접적인 하드웨어 접근이 필요한 임베디드시스템과 컴퓨터게임
    하드웨어로의 접근이 매우 느려 수행속도에 문제가 있다.
    하드웨어에 직접적인 접근을 하기 때문에 수행속도가 빠르다.
    <표 1 : 어셈블리어와 고급언어의 차이점>

    위의 내용이 이해가 가지 않더라도 겁먹을 필요 없다. 필자가 C언어를 배울 때 포인터에서 막혀 책을 덮은 것이 한두번이 아니었다. 나는 포인터를 왜 쓰는지 너무나 궁금해서 게시판 여기저기를 돌아다니며 질문을 해보고 당시 나우누리에서 강좌를 쓰시던 분에게도 메일을 보내 봤지만 통쾌한 대답을 얻을 수 없었다. 그러다가 포기하는 심정으로 포인터 뒷부분으로 계속 진도를 나가다 보니 왜 쓰는지는 물론 어떻게 활용해야 할지도 알 수 있었다.

    공부를 하다가 중간에 모르는 것이 생기면 일단은 그곳에 물음표를 달아놓고 지나가면 된다. 더 진도를 나간 후 다시 보면 이해할 수 있는 경우가 대부분이기 때문이다.

  • 자료 표현 방법

    컴퓨터는 자료를 어떻게 표현할까? 우선 자료가 무엇인지 생각해 보자. 자료는 컴퓨터로 우리가 정보를 활용하기 위한 값이다. 이것은 어떤 수치값이 될 수도 있고, 숫자가 될 수도 있다. 이러한 자료중 연관된 것을 일정 형식으로 잘 모아서 놓는다면 그림에 대한 정보를 가질 수 있고, 한 학생에 대한 정보를 가질 수도 있다. 또, 어떤 3D객체를 나타내기위해 필요한 정보를 가질 수도 있을 것이다. 정보이기 이전에 자료가 있다. 이제 이 자료를 컴퓨터에서 어떻게 표현하는지 알아보자.

    컴퓨터가 자료를 어떻게 표현하는지를 알려면 우선 이진수를 빼놓을 수가 없다. ‘컴퓨터는 0과 1밖에 모른다’라는 말은 한번 쯤 들어 보았을 것이다. 그렇다. 정말로 컴퓨터는 0과 1밖에 모른다. 우리가 고급언어로 프로그래밍 할 때는 컴퓨터가 0과 1밖에 모른다는 것이 그다지 와 닿지 않을 수도 있다. 대부분의 고급 언어는 이진 연산은 제공해도, 이진수를 직접 상수로 사용할 수 없다.

    하지만 어셈블리어는 이진수를 직접적으로 제어할 수 있고, 이진수를 직접 상수로 사용할 수 있다. 그만큼 다른 언어보다 이진수를 가까이 하고, 이진수 차원의 제어를 필요로 하는 언어가 어셈블리어이다.

    10진수는 0~9까지의 열 가지 숫자를 이용하여 숫자를 표현한다. 반면 이진수는 0~1까지의 두 가지 숫자만을 이용하여 숫자를 표현하는 것이다. 이진수의 한 예를 보여주겠다.

    (15) (0) 1011001010011100

    위에 괄호로 쓴 숫자는 무엇일까? 각각의 숫자에 번호를 매긴 것이다. 그 각각의 숫자 하나를 ‘비트(bit)'라고 한다. 위에 있는 이진수는 몇자리 숫자일까? 그렇다. 16자리 숫자이다. 그렇기 때문에 위의 이진수를 컴퓨터로 표현할 때는 16bit라고 한다. 16자리니까 16비트인 것이다.

    비트에 숫자를 매긴 것을 다시 보자. 15는 맨 왼쪽, 그러니까 제일 높은 자리수를 나타내고 ’비트15‘라고 부른다. 또 이 숫자에서 제일 높은 자리 숫자이기 때문에 '최상위 비트' (MSB: Most Significant Bit)라고 한다. 한글로 하면 ’최상위 비트‘이다. 0은 맨 오른쪽의, 그러니까 제일 낮은 자리수를 나타내고 ’비트0‘이라고 부른다. 또 이 숫자에서 제일 낮은 자리 숫자이기 때문에 '최하위 비트' (LSB: Least Significant Bit)라고 한다. 한글로 하면 ’최하위 비트‘이다.

    갑자기 많은 개념이 들어가서 헷갈리는가? 걱정말기 바란다. 나중에 나오면 다시 설명해 줄 것이다.


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