수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1620938
  • Today | 318
  • Yesterday | 482

Programming/Assembly2006/07/10 00:52

구조체란? 구조체 선언, 구조체 변수 사용하기

구조체란? 구조체 선언, 구조체 변수 사용하기

  • 시작하기에 앞서...

    어느덧 본 강좌도 끝을 향해 가고 있다. 이제 우리는 최소한 어셈블리어 코드를 보고 어떤 일을 하는지 정도는 파악할 수 있지만, 아직 뭔가 허전함을 느낄지 모르겠다. 본 회에 배울 구조체와 매크로에 관련된 내용은 그러한 허전함을 채워주리라 믿어 의심치 않는다.

    다른 언어도 마찬가지이지만, 나중에 버전업이 되어 새로운 것이 나오더라도 예전에 사용하던 형식과 개념 등은 그대로 묻어있게 마련이다. 어셈블리어도 마찬가지인데, 특히나 다른 프로그래밍언어에서 흔히 쓰이는 것이 어셈블리어에 약간 원초적(?)인 모습으로 존재하는 것을 볼 수 있다. 여기서 원초적이라는 말은 좀더 사용하기 불편하고 원시적으로 생겼다는 이야기이다. 필자는 어셈블리어의 프로시져나 배열, 구조체, 매크로 등을 처음 접할 때도 이러한 사실을 느끼고는 매우 흥미로워 했던 기억이 난다. 여러분도 기존에 사용하던 언어에 존재하던 클래스나 구조체, 매크로 등이 어셈블리어에 좀더 원초적(?)으로 존재하는 것을 배우며 희열을 느껴보길 바란다.

  • 구조체란?

    다른 프로그래밍 언어를 접해보신 분이라면 구조체가 무엇인지는 잘 알고 계실 것이다. 그래도 형식상 간단히 설명하자면 구조체는 개념적으로 연관있는 변수들의 그룹이자 틀이며 데이터형이다. 물론 이렇게 설명한다고 해서 이해하시는 분은 아무도 없을 것이다. 구조체를 하나 간단히 정의해 보겠다.

    COORD STRUCT X WORD ? Y WORD ? COORD ENDS

    위 구조체의 이름은 COORD이며 이것이 곧 데이터형이 된다. 뒤에 STRUCT라고 적힌 것을 보면 구조체를 말하는 것이라 추리할 수 있다. 또 마지막에 ENDS가 보이는데, 추측해 보건데, END Struct의 약자일 것이다. 보다시피 구조체의 정의는 너무나 간단하다. 구조체에 포함된 하나하나의 변수는 필드(field)라 불리우며, 멤버변수라고도 부른다. 그리고 ?표시를 한 곳은 초기화를 하지 않겠다는 뜻이다.
    구조체에 관련되어 배울 항목은 정의, 선언, 구조체변수 참조 이다. 하나하나씩 항목별로 배워보자.

  • 구조체의 정의

    구조체의 정의는 다음과 같이 한다.

    구조체이름 STRUCT 필드선언들... 구조체이름 ENDS

    구조체를 정의할 때는 초기값을 같이 넣어줄 수 있다. 초기값을 적는 형식은 우리가 일반 변수를 선언할 때와 같다. 다음의 예를 보자.
    Employee STRUCT IdNum BYTE "000000000" LastName BYTE 30 DUP(0) Years WORD 0 SalaryHistory DWORD 0, 0, 0, 0 Employee ENDS

    <그림 1 : Employee 구조체>

    첫번째 필드 IdNum을 보자. 스트링을 초기값으로 정해 놓았다. 숫자'0' 9개와 널문자 0, 총 10바이트가 들어간다. 잘 이해가 가지 않으면 3회를 다시 참고하기 바란다. 두번째 필드 LastName은 바이트원소가 30개 들어가는 배열에 초기값으로 모두 0을 넣어 두었다.(비어있는 스트링과 같기 때문에 그림1에서는 (null)이라고 적어 놓았다) 세번째 필드 Years는 WORD형으로 0을 하나 갖는다. 마지막 필드는 SalaryHistory로써 DWORD형 원소 4개에 각각 초기값을 0으로 넣어두었다. 두말할 필요도 없이 초기화를 하고 싶지 않으면 ?를 사용하면 된다.

    한가지 유의할 것은 위에 적어놓은 것은 구조체의 정의라는 것이다. 따라서 일종의 데이터 타입이 하나 생긴 것이고, 이를 사용하려면 구조체 변수를 선언해서 사용해야 한다.

  • 구조체의 선언

    좀 더 엄밀히 말하면 구조체에 대한 인스턴스의 선언 또는 구조체 변수의 선언이다. 두말할 필요도 없이 다음의 예제를 보면 쉽게 이해갈 것이라 믿는다. COORD는 본 회의 "구조체란?"단락에서 정의해 놓았던 그 구조체이다.

    .data point1 COORD <5, 10> point2 COORD <> point3 COORD {}

    이렇게<와 >를 사용하여 초기화를 해준다. 만약 < 와 >안에 아무것도 적어주지 않는다면 각 필드에 구조체의 정의에서 적어놓았던 초기값이 적용된다. <와 > 대신 { 와 }을 사용해도 무방하다. 이제 다음 구문을 보고 무슨 뜻일지 한번 생각해 보자.
    person3 Employee <, "Jones">

    눈치가 빠른 분은 이미 눈치챘을 것이다. 두번째 필드만 프로그래머가 지정한 초기값으로 초기화 하고 나머지는 디폴트 초기값으로 적용시키게 된다. 마지막으로 , 구조체의 배열은 어떻게 사용하는지 고민해 보자.
    AllPoints COORD 3 DUP (<0,0>)

    이제 COORD형 구조체 변수가 세 개 생겼고 구조체의 배열로 사용할 수 있게 되었다.
    지금까지는 구조체 변수를 선언하는 방법이었고, 다음 단락에서는 직접 구조체 변수를 사용하는 법을 배워보자.

  • 구조체 변수 사용하기

    구조체 변수를 사용하는 것은 놀랍게도 C언어와 다를 바가 없다. '.'을 이용하여 멤버에 접근하기 때문이다.

    .data worker Employee <> .code mov worker.SalaryHistory, 20000 ; 첫번째 봉급 mov worker.SalaryHistory + 4, 30000 ; 두번째 봉금

    C와 비슷하게 쓴다고 해서 마지막 줄의 코드까지 헷갈리지 않길 바란다. + 4를 했는데도 두번째 봉급이 된 이유는 DWORD타입(4바이트를 차지)이기 때문이다. 또 배열이라고 해서 다른 언어처럼 특별한 접근방식이 존재하는 것이 아니라 단지 주소에 덧셈을 하여 다음 원소로 접근한다는 것도 잊지 않기 바란다.

    이제 인다이렉트 오퍼랜드로 어떻게 접근하는지 알아보자. 인다이렉트 오퍼랜드는 4회에서 언급한 바 있다. 쉽게말하면 포인터로 접근하는 방법이다.


    mov esi, OFFSET worker mov ax, (Employee PTR [esi]).Years

    [esi].Years로 사용하는 실수를 범하지 않길 바란다. 구조체는 어셈블리에서 매우 잘 정의되어 있으며 사용하는데 있어 크게 어려울 것이 없다는 것을 느꼈을 것이다.

  • "Assembly" 카테고리의 다른 글
    • 반복 출력, REPEAT 디렉티브 & 연산자, 링크드 리... (0)2006/07/10
    • UNION 사용하기, 매크로란? 매크로 정의하기, 매크... (0)2006/07/10
    • 구조체란? 구조체 선언, 구조체 변수 사용하기 (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/1738

    Leave your greetings.

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

    «Prev  1 ... 1460 1461 1462 1463 1464 1465 1466 1467 1468 ... 2998  Next»

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

    Categories

    전체 (2998)
    Webdizen (134)
    Life (6)
    Diary (16)
    Blog (9)
    IDEA (1)
    Travel (10)
    Book (14)
    Photo (7)
    Movie (7)
    Music (13)
    Leisure Sports (10)
    Funny (5)
    Hardware (119)
    Software (120)
    Windows (5)
    Unix & Linux (119)
    Installation (4)
    Kernel (10)
    System (34)
    Develop (22)
    X-Window (0)
    Applicaton (31)
    Security (4)
    Framework (2)
    Hadoop (2)
    Programming (805)
    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 (3)
    Development (28)
    Useful Library (2)
    Data Modeling (0)
    Database (105)
    Oracle (4)
    MSSQL (41)
    MySQL (2)
    Data Warehouse (2)
    Data Mining (3)
    Network (66)
    Web (78)
    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

    • HTML 2.0
    • 놀이
    • Office
    • 감성정보
    • Exchange Server 2007
    • Compiler
    • 클러스터
    • Portable Executable
    • 리스트
    • 작업표시줄
    • 스페인
    • 구분자
    • Pooling
    • DAO
    • ODBC
    • The Secret
    • RegCreateKeyEx
    • hardware interrupt
    • SQL 주입
    • IOCP

    Recent Articles

    • ASCII Code의 CRLF 제거 방법.
    • Hadoop 에서 c++ API 이용시....
    • Ubuntu Linux에서 Hadoop 구....
    • 내 심장을 한껏 뛰게한 "국가....
    • 스타 스키마 데이터베이스 설....

    Recent Comments

    • ■ 온라인카지노 ▶ http://L....
      asdf 11/21
    • 그리고 혹시 해외여행자보험....
      kim 11/05
    • ★★실제 바다게임장과 똑같....
      asdf 11/04
    • sbsyama.co.to← 짱5000만당....
      asdf 11/04
    • ♡KicaZ??o(???) 바카라사....
      fdsf3fass 11/03

    Recent Trackbacks

    • 파일 열기/저장하기 CFileDialog.
      은마군의 나태블록 02/11
    • World IT Show 2008.
      상우 :: Oranzie's BLOG 2008
    • cvs서버 설치하기.
      3인3색 2008
    • 속속 공개되는 Google Chart....
      PHP와 Web 2.0 2007
    • 마방진을 구하는 프로그램.
      Oranzie's BLOG 3 2007

    Archive

    • 2009/09 (3)
    • 2009/08 (1)
    • 2009/03 (1)
    • 2009/02 (9)
    • 2009/01 (13)

    Calendar

    «   2009/11   »
    일 월 화 수 목 금 토
    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          

    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.