티스토리 뷰

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

/
1 .0 어셈블리언어 기초 (1)
0 어셈블리언어 기초 (2)
3 .0 어셈블리언어 기초 (3)
/
  • 레이블(Label)

    레이블이란 인스트럭션이나 데이터의 위치를 표시해 주는 것이다. 인스트럭션의 위치를 표시해 주는 것이라는 설명에 대해서는 C에서 goto문을 생각하면 가장 쉬울 것이다. C에서는 특정 문장 앞에 L1: 과같이 쓰고, 나중에 그 위치로 옮겨가고 싶을 때 goto L1;이라고 썼다. 어셈블리에서는 jmp이나 loop와 같은 인스트럭션을 쓸 때 사용하게 될 것이다. 이러할 때 쓰이는 레이블을 코드 레이블(Code Label)이라고 한다.

    데이터의 위치를 표시해 준다는 것은 무엇일까? 바로 변수의 이름이다. 변수의 이름이란, 데이터 영역에 일종의 레이블을 붙여 그 위치를 기억했다가 그 변수를 사용할 때 아까 기억해놓은 레이블을 이용해서 그곳에 값을 저장하거나 불러오는데 쓰인다.

    만약 데이터 레이블이 없다면 우리는 특정 주소에 변수를 사용하기로 약속하고는 그 주소를 계속 외우고 다녀야 할 것이다. 또 그 변수의 역할, 갖게될 값의 형태까지 기억하려면 얼마나 불편한지 짐작이 갈 것이다. 이렇게 데이터의 위치를 기억하는 레이블을 데이터 레이블(Data Label)이라고 한다.

  • 인스트럭션 니모닉(Instruction Mnemonic)

    아까 인스트럭션 니모닉에 대해 잠시 언급한 바가 있다. 좀더 자세히 설명해 보자면, Mnemonic의 사전적 의미는 "기억을 도와주는 장치"이다. 1회에서 필자가 말했던 것 처럼 CPU에게 내릴 명령코드를 의미있는 글자로 치환시켜주는 것이 어셈블리어의 기본 모토라고 하였다. 복잡한 명령 코드 대신 "기억을 도와주는 것"이 바로 이 니모닉이다. 대표적인 것으로 mov, add, sub와 같은 것이 있다. mov는 move의 약자이고, sub는 subtract의 약자이니까 어떤 일을 하는 인스트럭션인지는 짐작이 갈 것이다.

  • 주석(Comment)

    주석은 코드 자체가 수행할 일들과는 무관하지만, 보는 이로 하여금 좀더 쉽게 이해할 수 있도록 도와주는 것이다. 즉, 이부분에서 어떤 일을 하는지, 주의할 점은 무엇인지 등이다. 특히 어셈블리어는 프로시져가 어떤일을 하는지, 매개변수는 어떤 것을 받는지, 리턴값은 어떤지에 대해 주석을 달지 않으면 해석하기가 정말 힘들다. 게다가 매개변수로 레지스터 메모리를 사용하기라도 한다면 더더욱 이해하기 힘들어진다.

    그래서 주석은 아무리 강조해도 지나침이 없다. 아까 설명했듯이 대표적인 주석은 세미콜론(;)인데, ;로 시작해서 그 줄의 끝까지가 주석이 된다. (이것을 가장 많이 쓰게 될 것이다.) 또다른 형태의 주석은, C에서 /* */와 같이 일종의 블럭안을 모두 주석으로 처리해 주는 것이다. 이는 다음과 같이 사용할 수 있다.

    COMMENT ! This line is a comment. Welcome to Internet.com !

    !대신에 &와 같이 사용자가 하고싶은 기호를 사용해도 된다. 이렇게 하면 COMMENT  ! 와 !로 둘러싸인 부분이 모두 주석이 된다.

  • 자료 정의하기

    자료를 정의하는 방법을 배워보자. 쉽게 말해서 변수를 만드는 것이다. 그러기 위해서는 자료형을 알아야 한다. C에 int, long, float, double이 있는 것처럼, 어셈블리어에도 자료형이 있다. 다음의 표에 열거해 놓았으니 참고바란다.

    Type

    Usage

    BYTE

    8비트 부호없는 정수

    SBYTE

    8비트 부호있는 정수

    WORD

    16비트 부호없는 정수

    SWORD

    16비트 부호있는 정수

    DWORD

    32비트 부호없는 정수

    SDWORD

    32비트 부호있는 정수

    FWORD

    48비트 정수

    QWORD

    64비트 정수

    TBYTE

    80비트 정수

    REAL4

    IEEE표준의 32비트 실수

    REAL8

    IEEE표준의 64비트 실수

    REAL10

    IEEE표준의 80비트 실수

    <표 2 : 자료형>

  • 자료 정의하기

    C로 치면 변수 선언 방법이라고 할 수 있고, 다음과 같은 형식을 같는다. 이름 디렉티브 초기값, 초기값... 이름은 생략될 수도 있다. 디렉티브는 표 2에 나온 것들을 말한다. 각각을 설명하자면, 먼저 맨 앞의 이름은 앞에서 이야기한 데이터 레이블이다. 레이블은 없을 수도 있다. 초기값이 여러개인 것이 궁금할 것이다. 초기값을 두 개 이상 쓰게 되면 그것은 메모리에 연속적으로 초기값의 개수만큼 공간이 할당되며 해당 초기값으로 초기화된다. 메모리에 연속적으로 위치하게 되므로, 메모리 주소 연산을 이용하여 일차원 배열처럼 사용할 수 있을 것이다. 이에 대한 예는 나중에 설명하도록 하겠다. 자료 정의에 대한 예는 다음과 같다. value1 BYTE 'A' ; 문자 상수 value2 BYTE 0 value3 SBYTE ?디렉티브를 대문자로 쓴 것은 단지 보기 좋으라고 한 것이니까 신경쓰지말자. 대소문자는 구분하지 않는다고 했으니 소문자로 써도 상관없다. 값을 굳이 초기화하지 않아도 된다면 value3와 같이 초기값 자리에 ?를 사용할 수 있다.

  • 문자열 정의하기

    C언어에서 배열에 문자열 넣을 때는 char string[25] = "abcdef"; 이런식의 사용이 허용된다는 것을 기억하는가? 어셈블리어도 문자열 정의에 있어서는 많은 배려를 해주고 있다. 다음을 보라. greeting1 BYTE "Hi~>.<;",0 ; 1번 greeting2 BYTE 'H', 'i', '~','>', '.', '<', 0 ; 2번 위의 1번과 2번은 완전히 같은 것이다. 맨 뒤에 붙은 0은 무엇을 의미할까? 바로 문자열의 끝을 나타내는 것으로서 널문자라고 한다. 개행문자를 넣고 싶다면 해당 위치에 0Ah, 0Dh를 넣어야 한다. 도스에서는 캐리지리턴과 라인피드가 모여서 하나의 개행문자를 이루기 때문이다.

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