티스토리 뷰

[전광성의 어셈블리어 이해하기:3회] 어셈블리언어 기초 (1)
저자: 전광성 |  날짜: 2004년 12월 22일  

/
0 어셈블리언어 기초 (1)
2 .0 어셈블리언어 기초 (2)
3 .0 어셈블리언어 기초 (3)
/
  • 강좌를 시작하며

    이번 강좌에서는 어셈블리어로 프로그램을 작성하기 위해 필요한 기본 지식들을 배우게 될 것이다. 즉, 자료형과 간단한 명령어, 코딩할 때 알아야할 기반 지식들을 배우게 될 것이다. C언어를 처음 배울 때 #include 부터 배우듯이, 차근차근 밟아나갈 것이다. 참고로 우리는 앞으로 매크로 어셈블러를 사용할 것이다.

    여기에 나올 간단한 예제들을 직접 해보고 싶다면, 최신버젼을 구해서 해보기 바란다. 그리고 이 강좌 소개및 목차부분에서 언급한 책에서 제공하는 라이브러리도 사용하게 될 것이다. 라이브러리라고 해서 특별한 것은 없다. 단지, 우리가 수행한 것이 제대로 되었나 출력해 봐야하는데, 많이 배우지 못한 상태에서 복잡한 출력 루틴을 만드는 것보다는 다른 라이브러리를 이용해 일단은 기본개념을 배우는 것이 좋기 때문이다. 그럼 이제 시작해 보자.

  • 어셈블리어의 기본적인 구성요소

    어셈블리의 기본적인 구성요소로는, 정수 상수, 정수 수식, 실수 상수, 문자 상수, 문자열 상수, 예약어, 식별자, 디렉티브(Directives), 인스트럭션(Instructions), 레이블(Label)등이 있다.

  • 상수

    상수란 결국에 어떤 한 값인데, 코드에 숫자 그대로 입력되어 실행중에 값을 변경할 수 없거나, 변수이지만 값을 변경시킬수 없는 것을 의미한다. 먼저 정수 상수에 대해 알아보자.

    정수 상수는 우리가 흔히 쓰는 표기대로 부호는 있거나 없어도 되고, 없다면 양수로 취급된다. 단지 다른 것이 있다면, 숫자 뒤에 radix라는 것을 붙여주는데 쉽게 이야기하면 진법을 이야기 하는 것이다. 우리가 이진수를 1010(2)라고 쓰고, 8진수를 777(8)이라고 수학에서 사용하듯이, 이곳에서도 뒤에 진법을 표기해 준다. 물론 뒤에 진법을 표기하지 않는다면 십진수로 취급된다.

    다음 표1을 보면 쉽게 이해가 갈 것이다. 참고로 radix에는 실수를 표현하기 위한 것으로 r도 올 수 있는데, 이는 실수가 메모리에 저장되는 방식을 직접 우리가 기술하는 것이다. 그다지 본 강좌의 목적과 부합하지 않으므로 자세한 설명은 생략하겠다.

    h

    16진수

    q 또는 o

    8진수

    d 또는 t

    10진수

    b 또는 y

    이진수

    <표 1 : radix >

    이번에는 실수 상수에 대해 알아보자. 실수 역시 부호 규칙을 정수와 같다. 하지만 26과 26.은 다르다는 사실을 아는가? 실수는 반드시 .을 포함하고 있어야 한다. 26은 정수이고 26.은 실수이다. 정수와 실수는 컴퓨터에서 저장하는 형식이 다르다는 것은 알고 있으리라 믿는다. 또, 과학적 표기법을 사용할 수 있는데, 다음을 보아라.

           -44.2E+5

    C에서도 이런 것을 본 적이 있을 것이다. E는 exponent를 뜻하고 그냥 과학적 표기법을 표시하기 위해서 사용한다고 생각하면된다. 저 위에 있는 것을 풀어 이야기하면 "-44.2 곱하기 10의 +5승"이다. 뒤에 +5대신 -2가 온다면 "-44.2 곱하기 10의 -2승"이 될 것이다.

    다음은 문자 상수이다. 어셈블리어에 내가 한 글자를 표현하고 싶다면 작은따옴표(')나 큰 따옴표를 이용해 묶으면 된다. 이 둘의 차이는 없다. C처럼 큰 따옴표를 사용한다고 문자열인 것은 아니니, 헷갈리지 않길 바란다.

    'A'라고 쓰면 사실 코드에는 그렇게 보이지만 어셈블할 때(즉, 컴파일할 때) 이는 A에 해당되는 아스키코드로 변환된다. 즉, 정수와 같다는 이야기가 된다. 달리 특별한 것으로 착각하지 않길 바란다.

    이번엔 문자열 상수에 대해 알아보자. 문자열 상수 역시 문자상수처럼 작은 따옴표 또는 큰 따옴표로 표기된다. 혹시라도 문자열 안에 따옴표를 쓰고 싶다면 다음과 같이 하면 된다.

         'I said "Hi, internet.com.".'

    즉, 안쪽에 큰 따옴표를 쓰고싶다면 문자열의 시작과 끝을 나타내는 기호로 작은 따옴표를 사용하면 된다.

  • 예약어

    예약어란, 어셈블리언어가 먼저 사용하고 있는 단어들을 의미한다. C언어에서 예를 든다면 int같은 것이 있을 것이다.

    - 인스트럭션 니모닉(Instruction mnemonics) : CPU에게 직접 내리는 명령(Instruction)이다.
    - 디렉티브(Directives) : 어셈블리어에게 어떻게 어셈블할 것인지 지시해준다.
    - 속성(Attributes) : BYTE와 WORD같이 변수등이 어떤 크기에 어떤정보를 담고 있을지를 알려주는 단어이다.
    - 연산자(Operators) : 상수 수식에 사용되는 연산기호(*, +, -, / 같은 것들)를 뜻한다.
    - 미리정의된 기호(Predefined Symbols) : @data와 같이 어셈블할 때 특정 값을 갖게되는 기호이다.

    갑자기 이런 개념들이 나와 헷갈릴지 모르겠지만, 조금있다가 설명할 것이니 이런 것이 있구나, 하고 넘어가주길 바란다.

  • 식별자(Identifiers)

    식별자는 프로그래머가 선택하는 이름이다. 변수이름, 상수이름, 프로시져(쉽게 말해서 함수)이름, 코드 레이블(label) 와 같은 것들이며, 다음의 규칙을 갖는다.

    - 길이는 1~247글자이다.
    - 대소문자를 구분하지 않는다. 즉, A와 a는 같다.
    - 첫번째 글자는 반드시 (A~Z, a~z, _, @, $)중의 하나가 와야한다. 두번째 이상의 글자부터는 숫자가 올 수도 있다.
    - 식별자는 예약어와 같아서는 안된다(위에 예약어에 대해 설명해 놓았다).

    참고로, @로 시작하는 식별자는 되도록 쓰지 않는 것이 좋다. 어셈블러가 미리정의해 놓은 기호로 자주 사용되기 때문이다.

  • 디렉티브(Directives)

    디렉티브(Directive)는 CPU에 직접 프로그래머가 명령을 내리는 것이 아닌, 어셈블러가 어셈블 할 때(컴파일 할 때) 해석하여 특정 일을 수행해 주는 명령을 이야기한다. 디렉티브는 주로 세그먼트, 메모리 모델 설정, 변수 정의, 프로시져(함수)만들 때 사용된다. 즉, 일종의 어셈블러 문법인 셈이다. 여기서도 대소문자는 구분하지 않는다.

    .data와 .DATA는 같은 것으로 인식된다. 다음에 나올 인스트럭션(Instruction)과 비교해 보면 그 차이를 짐작할 수 있을 것이다.

  • 인스트럭션(Instructions)

    인스트럭션은 네 부분으로 구성된다.

          레이블:       니모닉            피연산자            ; 주석
          Label:        Mnemonic       Operand(s)        ; Comment

    흔히 하나의 인스트럭션은 위와같이 구성되는데, Label과 Comment는 선택 사항이다. 단, Mnemonic은 반드시 있어야 하며, Mnemonic에 따라 Operand의 개수와 형(위에서말한 속성(attributes))이 결정된다. Instruction Mnemonic은 단지 CPU에 내리는 명령코드를 이해하기 쉽게 영문약자로 표시해준 것이고, Instruction은 피연산자와 부수적인 것들을 포함한 완전한 명령을 의미한다.

    사소한 것이지만, 헷갈리지 않도록 한다. 레이블은 반드시 그 뒤에 콜론(:)이 붙어야 하며 주석은 반드시 그 앞에 (;)가 붙어야 한다. 이는 C++에서 // 와 같은 기능을 한다.

    이제 이 네가지를 하나하나 살펴보기로 한다. 다음 페이지를 보라!


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