수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1694071
  • Today | 422
  • Yesterday | 588

Programming/Assembly2006/07/10 00:52

UNION 사용하기, 매크로란? 매크로 정의하기, 매크로 호출하기 LABEL

UNION 사용하기, 매크로란? 매크로 정의하기, 매크로 호출하기 LABEL

  • UNION 사용하기

    UNION은 흔히 공용체라고 부르기도 한다. 구조체와 생김새는 비슷하지만 한 가지 다른 점은 모든 멤머가 같은 메모리 공간을 사용한다는 것이다. 즉, UNION에 세 개의 필드가있다고 할 때, 이 세 가지 중 한가지만 사용할 수 있다는 것이다. 따라서 UNION의 크기는 세 필드중 사이즈가 가장 큰 필드의 크기와 같다. 다음과 같이 정의하면 된다.

    유니온이름 UNION 필드들... 유니온이름 ENDS

    또한 구조체의 필드중 몇몇의 필드만 묶어서 UNION으로 정의할 수 있다.

    구조체이름 STRUCT 구조체필드들... UNION 유니온필드이름 유니온필드들... ENDS 구조체이름 ENDS

    약간 복잡해 보이지만 사실은 '유니온필드들'만 유니온으로 감쌌을 뿐이다. 유니온필드에 접근할 때는 '구조체이름.유니온필드이름.유니온필드' 로 접근하면 된다. 지금까지 언급한 특징만 다를 뿐이지, 사용하는 방법에 있어서 유니온과 구조체는 차이점이 없다. 위와같이 하는 것이 헷갈린다면 먼저 유니온을 정의한 후, 구조체 필드에 유니온 변수를 선언하면 된다. 그리고 하는 일은 두 가지 방법이 완전히 같다.

    몇몇 독자는 UNION을 과연 어디에 쓰게 될지 궁금해 하실지 모르겠다. 작성하는 프로그램이 메모리를 매우 적게 차지해야하는 경우, 구조체의 멤버 중 동시에 쓰이지 않는 멤버를 유니온으로 묶어서 사용하면 메모리를 절약할 수 있다. 이와는 달리 유니온만의 특성을 이용한 예가 있다. 바로 IP주소에 대한 것이다. 소켓 프로그래밍을 해보신 분은 알겠지만 IPv4에서 IP주소는 4바이트이다. 우리가 눈으로 볼 때는 이 4바이트의 IP주소를 1바이트씩 잘라 읽어야 편리하다는 것을 잘 알고 있을 것이다. (우리가 잘 알고 있는 203.253.21.151의 형태) 이러한 경우 UNION을 유용하게 써먹을 수 있다.

    IP UNION inDword DWORD 0 inByte BYTE 0 0 0 0 IP ENDS
    IP.inDword에 4바이트의 IP주소를 넣고, IP.inByte , IP.inByte + 1, IP.inByte + 2, IP.inByte + 3으로 하나씩 값을 읽으면 우리가 읽기 편한 형태가 될 것이다. 다만 여기서 인텔 계열의 CPU는 리틀엔디안 오더를 사용하기에 우리가 흔히 생각하는 것과는 반대의 순서로 읽어야 한다는 점에 유의해야할 것이다.(3회 참고)

  • 매크로란?

    매크로란, 어셈블리 구문들을 하나로 묶어놓은 것이다. 겉으로 보기엔 프로시져와 매우 유사한 형태를 갖고 있다. 하지만 C에서의 매크로 함수와 같아서, 스택에 수많은 push와 pop을 해가며 함수를 호출하는 것이 아니라, 단지 코드가 덧씌워질 뿐이다. 따라서 속도는 매우 빠른 장점을 지닌 반면, 조심해서 사용하지 않으면 코드가 덧씌워지기 때문에 프로그램의 크기가 매우 커질 것이다. 다음과 같은 매크로가 정의되어있다고 하자.

    NewLine MACRO call Crlf ENDM

    이 매크로는 단지 화면에 개행문자(텍스트 에디터에서 엔터를 누른 것과 같은 효과)를 찍는 일만 수행한다. 매크로를 어떻게 정의하는지 대한 정확한 설명은 다음 단락에 이어질 것이다.

    .code NewLine

    위와 같은 코드는 전처리기(어셈블러가 컴파일하기 전에 수행된다)에 의해 다음과 같이 바뀐다.

    .code call Crlf

  • 매크로 정의하기

    매크로는 소스코드의 어느 부분에서도 정의될 수 있다. 하지만 매크로는 소스코드에서 정의되기 이전에 호출될 수는 없다.

    매크로이름 MACRO 파라미터1, 파라미터2, ... 구문들 ENDM
    정의는 위와 같이 한다. 매크로가 단순히 텍스트 치환보다 좋은 이유는 바로 파라미터를 넘길 수 있다는 점이다. 다만 조심할 점은 파라미터의 값이 매크로 내부로 넘어가는 것이 아니라는 점이다. 매크로는 단지 코드를 복사해주는 일만 하기 때문에, 코드 수준에서 파라미터를 인자로 넘어온 변수이름으로 치환하는 것에 불과하다. 만약 호출 시에 매크로가 요구하는 파라미터 개수보다 적은 개수가 넘어온다면 나머지는 빈칸으로 남겨진다. 이런 경우 대부분 구문 오류가 발생할 것이다.
    다음은 인자로 넘어온 문자를 화면에 찍어주는 일을 하는 매크로이다.

    mPutchar MACRO char push eax mov al, char call WriteChar pop eax ENDM

  • 매크로 호출하기

    매크로를 호출하려면 다음과 같이 사용한다.

    매크로이름 인자1, 인자2,...
    이제 실제로 매크로를 호출한 경우 코드에 어떤 일이 일어나는지 직접 살펴보자. 윗 문단에서 정의한 mPutchar를 예로 들어 설명하겠다.

    mPutchar 'A'
    라고 사용한 경우, 컴파일되기 전에 코드는 다음과 같이 변환된다.
    push eax mov al, 'A' call WriteChar pop eax
    코드는 위와 같이 변환된다. 다시한번 강조하지만 매크로의 파라미터는 단순한 텍스트 치환이다.

  • LABEL 디렉티브

    사실 LABEL디렉티브는 구조체나 매크로와는 그다지 관련이 있지 않다. 하지만 이 디렉티브를 언급하는 이유는 나중에 나올 링크드 리스트 예제에 이것이 나오기 때문이다. 크게 어려운 내용이 아니니 부담없이 읽어주기 바란다.
    4회에서 나왔던 내용이지만, 다시한번 변수에 대한 이야기를 해 보겠다. .data에 선언된 변수의 이름은 레이블이다. 우리가 흔히 '라벨'이라고 부르는 것을 떠올리면 레이블의 역할이 뭔지 알 수 있을 것이다. 우리가 선언한 데이터들은 데이터 세그먼트에 들어가게 되고 이 데이터 세그먼트의 시작부분으로부터 선언된 데이터가 존재하는 곳 까지의 거리(Offset)를 통해서 그 데이터에 접근하게 된다. 여기서 '거리'라고 하는 것은 숫자이기 때문에 사람이 기억하기가 어렵다. 따라서 각각의 '거리'에 대한 레이블을 하나씩 만들어놓은 것이 데이터 레이블인 것이다.

    LABEL디렉티브는 데이터 세그먼트에 이미 존재하는 변수에 또 하나의 이름과 타입을 지정해주는 데 이용된다. 다음의 사용예를 보아라.

    .data val16 LABEL WORD val32 DWORD 12345678h .code mov ax, val16 ; AX = 5678h mov dx, val16 + 2 ; DX = 1234h
    ax와 dx에 들어간 값이 뒤바뀐것 같다는 생각이 든다면 본 강좌 3회에 있는 리틀엔디안 오더를 다시 보기 바란다.

  • "Assembly" 카테고리의 다른 글
    • CPU 레지스터 (0)2007/03/15
    • 반복 출력, REPEAT 디렉티브 & 연산자, 링크드 리... (0)2006/07/10
    • UNION 사용하기, 매크로란? 매크로 정의하기, 매크... (0)2006/07/10
    • 구조체란? 구조체 선언, 구조체 변수 사용하기 (0)2006/07/10
    • 버블소트 (0)2006/07/10
    2006/07/10 00:52 2006/07/10 00:52
    Posted by webdizen
    No Trackback No Comment

    Trackback URL : http://www.webdizen.net/blog/trackback/1739

    Leave your greetings.

    [로그인][오픈아이디란?]

    «Prev  1 ... 1470 1471 1472 1473 1474 1475 1476 1477 1478 ... 3009  Next»

    RSS HanRSS
    Blog Image
    webdizen
    이곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

    Categories

    전체 (3009)
    Webdizen (141)
    Life (6)
    Diary (16)
    Blog (9)
    IDEA (2)
    Travel (10)
    Book (16)
    Photo (7)
    Movie (8)
    Music (14)
    Leisure Sports (10)
    Funny (6)
    Hardware (121)
    Software (120)
    Windows (5)
    Unix & Linux (120)
    Installation (5)
    Kernel (10)
    System (34)
    Develop (22)
    X-Window (0)
    Applicaton (31)
    Security (4)
    Framework (2)
    Hadoop (2)
    Programming (804)
    Algorithm & Data Structure (1)
    Assembly (38)
    UNIX/Linux C (95)
    C++ (128)
    STL (4)
    Java (38)
    Win32 API (92)
    ATL/COM (44)
    MFC (151)
    .NET (26)
    WCF/WPF (4)
    C# (28)
    Network Programming (17)
    Database Programming (12)
    OpenGL / DirectX (13)
    Multimedia Programming (0)
    Game Programming (21)
    Parallel Distributed Progra... (0)
    Reverse Engineering (0)
    Debugging (9)
    Python (1)
    Ruby (1)
    Ruby on Rails (1)
    QT (4)
    GTK (0)
    JSP (0)
    PHP (6)
    ASP.NET (6)
    ASP (2)
    Development (28)
    Useful Library (2)
    Data Modeling (0)
    Database (105)
    Oracle (4)
    MSSQL (41)
    MySQL (2)
    Data Warehouse (2)
    Data Mining (4)
    Network (66)
    Web (79)
    DHTML (4)
    XHTML (1)
    Javascript (1)
    CSS (1)
    AJAX (9)
    XML (11)
    Flex (1)
    Silverlight (3)
    Security (91)
    DoS (1)
    Kernel (10)
    Scanning (3)
    Sniffing (0)
    Spoofing (4)
    Overflow (28)
    Web (11)
    Shell (10)
    Format String (14)
    Window (2)
    Embedded (70)
    Multimedia (27)
    Mobile (14)
    Graphic (24)
    Management (633)
    Knowledge (581)
    Hadoop (0)

    Notice

    • 메타 블로그 사이트에 등록
    • 새해 맞이 블로그의 변화
    • 블로그 명칭 변경
    • 도메인(www.webdizen.net) 구...
    • TEXTCUBE 1.6.1로 업그레이드...

    Tags

    • Reporting
    • breakpoint
    • 컨퍼런스
    • 성능
    • 한국과학기술원
    • 커널 모듈 프로그래밍
    • 프로그램 중복 실행 방지
    • CakePHP
    • 서술 작업
    • Container
    • 객체 지향 모델링
    • 동적 SQL
    • 데이터 웨어 하우스
    • Traffic
    • 프렌즈
    • 트랜잭션
    • Miscellaneous
    • 애플
    • 이건희
    • 소운동장

    Recent Articles

    • 트위터(Twitter)의 시작!.
    • 청년 리더의 조건.
    • 애플의 타블렛 PC - 아이패드....
    • 미래의 인터페이스 - 육감 기....
    • 기초발성법 동영상 강좌.

    Recent Comments

    • 학교 과제물중 쓰레드에 대하....
      장진혁 03/17
    • 관리자만 볼 수 있는 댓글입....
      비밀방문자 03/12
    • 상대방의 이야기를 열심히 경....
      DoNuts 03/03
    • Lots of students know techn....
      Bobbi35Shannon 02/25
    • 좋은글 잘 보고 갑니다..
      Und_hacker 01/08

    Recent Trackbacks

    • printf,scanf를 이용한 형식....
      yundream의 프로그래밍 이야기 03/10
    • 파일 열기/저장하기 CFileDialog.
      은마군의 나태블록 2009
    • World IT Show 2008.
      상우 :: Oranzie's BLOG 2008
    • cvs서버 설치하기.
      3인3색 2008
    • 속속 공개되는 Google Chart....
      PHP와 Web 2.0 2007

    Archive

    • 2010/02 (1)
    • 2010/01 (6)
    • 2009/12 (5)
    • 2009/09 (3)
    • 2009/08 (1)

    Calendar

    «   2010/03   »
    일 월 화 수 목 금 토
      1 2 3 4 5 6
    7 8 9 10 11 12 13
    14 15 16 17 18 19 20
    21 22 23 24 25 26 27
    28 29 30 31      

    Bookmarks

      • Administration
        • IIS.NET
        • NTFAQ
        • OS의 모든 것
        • 리눅스포털
      • Database
        • SQL Server Central
        • SQL Team
      • Development
        • .NET Heaven
        • ASP Alliance
        • ASP.NET 2.0
        • Bullog.net
        • C# Corner
        • C++ (C PlusPlus.com)
        • C++ Reference
        • CodeGuru
        • CodePlex
        • DebugLab
        • Dev Articles
        • Devpia
        • DotNet Junkies
        • DotNet Zone
        • Driver Online
        • GOSU.NET
        • HOONS 닷넷
        • Joinc 팀블로그
        • KOSR
        • MSDN Home Page
        • OSR Online
        • Sky.ph - 개발자 커뮤니...
        • TAEYO.NET
        • The Code Project
        • WindowsClient.net
        • 김상욱의 개발자 Side
        • 조인시 위키
      • Human Networks
        • belief21c's e-space
        • I think I can
        • Invisible Rover's Blog :D
        • Rodman®
        • ■ Feel So Good~! ■
        • 까만 나비
        • 나를 가꾸는 시간.
        • 나만의 즐거움~~!
        • 단녕
        • 상우 :: Oranzie's BLOG
      • Information Technology
        • Microsoft TechNet
        • 지디넷코리아 - 글로벌...
      • Security
        • FoundStone
        • milw0rm
        • NewOrder
        • OpenRCE
        • Phrack.org
        • Reverse Engineering b1...
        • Reverse Engineering Team
        • RootKit
        • SecurityFocus
        • SecurityXploded by Nag...
        • Wow Hacker
        • Zone-H
    Textcube
    Louice Studio Inc.
    Powered by Textcube. Original designed by Tistory.