수안이의 컴퓨터 연구실

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

Programming/Assembly2006/07/10 00:55

반복 출력, REPEAT 디렉티브 & 연산자, 링크드 리스트 예제

반복 출력, REPEAT 디렉티브 & 연산자, 링크드 리스트 예제

  • 반복 블럭

    반복 블럭은 어셈블리어 구문들을 여러번 반복하게 해주는 '디렉티브'이다. 이들의 특징은 반복횟수가 상수에 의해 결정된다는 것이다. 이들은 우리가 흔히 아는 반복문과는 약간 다르다. 지금 말하는 반복 블럭은 일종의 매크로와 같은 역할을 하는 것임을 깊이 새기기 바란다.
    반복 블럭에는 WHILE, REPEAT, FOR, FORC 등이 있는데, 대표적으로 숫자에 적용되어 가장 자주 쓰이는 REPEAT에 대해서 알아보자.

  • REPEAT 디렉티브

    다른 반복 디렉티브들은 수식, 심볼, 문자에 대해 반복하는 반면, REPEAT 디렉티브는 상수수식의 값만큼 반복하기 때문에, 그만큼 쓰임새가 크다.

    REPEAT 상수수식 구문들... ENDM
    직접 써보지 않으면 느낌이 오지 않을 것이다. 아래와 같은 코드가 어떤 일을하게 될지 추측해 보라.

    .data array LABEL DWORD iVal = 10 REPEAT 100 DWORD iVal iVal = iVal + 10 ENDM
    위와같은 코드는 루프를 100번 돌면서 다음과 같은 배열을 만들 것이다.

    array DWORD 10, 20, 30, 40, ... 1000
    원소의 사이즈는 4바이트이고 총 100개의 원소를 갖게 된다. 따라서 REPEAT디렉티브는 많은 변수를 선언하고 초기화할 때 유용하다. 다시한번 말하지만 반복블럭은 일종의 매크로이며 반복회수만큼 코드를 붙여넣는다는 것을 잊지 않기 바란다.

  • $ 연산자

    이 연산자는 조금은 특이한 연산자이다. 예제를 먼저 살펴보자.

    list WORD 10, 20, 30, 40 ListSize = ($ - list) / 2 ; ListSIze는 4
    list의 사이즈를 구하는데 $연산자를 이용하였다. $는 이 연산자가 쓰인 위치의 오프셋을 리턴해준다. 쉽게 이야기하면 $가 쓰일 자리에 변수가 정의되었다면 그 변수가 갖게 되었을 '데이터 세그먼트 시작부분으로부터의 거리(Offset)'를 리턴해 준다는 뜻이다(이 Offset을 흔히 주소라고도 부른다). 쉽게 말하면 $는가장 최근에 정의한 데이터의 바로 다음 주소를 리턴해 준다는 말이다. 위의 예에서 $는 메모리상에서 list 배열 네번째 원소의 바로 뒤를 가리키며, list는 배열의 첫 번째 인덱스를 가리키므로 ($ - list)는 8이 된다. 왜 4가 아니고 8이냐는 궁금증이 생긴다면, list배열이 WORD형으로 되어있음을 다시한번 눈여겨 보시기 바란다.

  • 링크드 리스트 예제

    본회에서 배운 내용을 복습하는 의미에서 링크드리스트를 사용하는 간단한 프로그램을 작성해 보겠다.
    링크드 리스트(Linked List)는 연결리스트라고도 하며, 각각의 노드를 포인터를 이용하여 연결함을로써 구현된다. 그림 2와 같은 구조를 떠올리면 이해하기 쉬울 것이다.(사실 여기까지 강좌를 읽으며 이해하고 계신 분이라면 충분히 알고 있을 것이다.) 그림 2는 단방향의 링크드리스트를 나타낸다.

    <그림 2 : 링크드 리스트(linked list)>
    링크드 리스트를 구현해 보았다면 알겠지만 구조체를 사용해야 한다. 링크드 리스트를 위한 구조체를 정의할 때 반드시 다음 노드의 주소를 갖는 필드를 적어 주어야 함은 말할 밀요도 없다.

    이제 구조체를 정의해 보자. 구조체의 정의는 너무나도 간단하다.

    ListNode STRUCT NodeData DWORD ? ; 노드의 데이터값을 갖는다. NodePtr DWORD ? ; 다음 노드의 주소를 갖는다. ListNode ENDS
    한 회 내에서 데이터 추상화된 링크드 리스트를 만드는 것은 무리이므로, 최대한 간단히 다음과 같이 링크드리스트를 미리 만들어 놓겠다. 이것은 물론 .data에 들어갈 코드이다.

    TotalNodeCount = 15 NULL = 0 Counter = 0 .data LinkedList LABEL DWORD ; (1) REPEAT TotalNodeCount ; (2) Counter = Counter + 1 ; (3) ListNode <Counter, ($ + (Counter * SIZEOF ListNode))> ENDM ListNode <0, NULL> ; (4) 꼬리노드
    첫번째 줄에서 세번째 줄 까지는 단지 기호상수의 정의에 불과하므로 .data이하부터 설명하겠다. 이곳은 헷갈리기 쉬우니 눈여겨 보기 바란다.
    (1) 먼저 LABEL디렉티브가 나왔는데, LABEL디렉티브 뒤에 나온 DWORD는 형식적인 것이다. 왜냐하면 나중에 사용할 때는 어차피 ListNode인 것처럼 사용하기 때문이다. LinkedList라는 데이터 레이블은 링크드리스트 첫 번째 노드에 대한 데이터 레이블로 쓰이게 된다.
    (2) REPEAT디렉티브는 첫 번째 인자의 상수값만큼(여기서는 15) 루프를 돌리게 된다.
    (3) 따라서 Count가 1씩 증가되면서 15개의 ListNode가 선언된다. 위 코드에서는 선언과 동시에 초기화를 시켜주고 있는데, 두 번째 필드에서는 ($ + (Counter * SIZEOF ListNode))을 이용하여 다음 노드의 오프셋을 얻어온다. $값은 LinkedList레이블이 가리키는 오프셋을 갖고, REPEAT블럭 내에서 변하지 않는다. 왜냐하면 루프가 돌기 이전에 $연산자가 계산되기 때문이다.
    (3) 결과적으로, 꼬리노드를 포함한 16개의 노드가 모두 연결된다.

    이제 본격적으로 main프로시져를 정의해 보겠다. 다음의 코드는 데이터 영역에서 만든 링크드 리스트를 탐색하며 각각의 NodeData를 찍고난 후 종료한다.

    .code main PROC ; (1) mov esi, OFFSET LinkedList ; NodeData 필드의 모든 정수들을 보여준다. NextNode: ; (2)꼬리노드인지 체크해 본다. mov eax, (ListNode PTR [esi]) .NextPtr cmp eax, NULL je quit ; (3)NodeData를 출력한다. mov eax, (ListNode PTR [esi]) .NodeData call WriteDec call Crlf ; (4)포인터를 다음 노드로 옮긴다. mov esi, (ListNode PTR [esi]) .NextPtr jmp NextNode quit: exit main ENDP END main
    (1) 링크드 리스트의 시작 주소를 esi에 넣어둔다. 이제 esi는 노드를 가리키는 포인터로 쓰일 것이다.
    (2) 루프를 계속 돌 것인지를 결정하는 부분이다. esi가 가리키는 주소에 존재하는 ListNode형 구조체변수의 NextPtr이라는 필드를 읽어서 eax에 넣는다. 물론 eax에 넣는 이유는 NULL인지 판단하기 위해서다. NextPtr필드가 NULL이라는 것은 더이상 다음 노드가 없다는 뜻이기 때문이다. 만약 NULL이라면 quit레이블로 점프하여 프로그램을 종료하게 된다.(NULL은 데이터 영역에서 정의한 기호상수이며 0과 같다.)
    (3) esi가 가리키는 주소에 존재하는 ListNode형 구조체변수의 NodeData필드의 값을 eax에 읽어들인 뒤, 해당 데이터를 출력하고 개행문자를 출력한다. 개행문자는 우리가 텍스트 에디터에서 엔터를 누를 때와 같은 효과를 내는 문자이다.
    (4) 현재 esi가 가리키는 ListNode형 구조체변수의 NextPtr필드 값을 다시 esi에 복사해 넣는다. 따라서 esi는 다음 노드의 주소를 갖게 될 것이다. 그 다음 다시 NextNode레이블로 돌아가서 지금까지 해온 과정((2)~(4))을 반복한다.

  • 강좌를 마치며...

    이번 회에서는 구조체와 매크로에 대해 배워보았다. 적어도 한 가지의 고급언어를 프로그래밍해보신 여러분들은 어셈블리어를 보면서 자신이 다뤘던 프로그래밍 언어들이 어떻게해서 어셈블리어로 구현될지에 대해서도 머릿속에 조금씩 떠오르리라 믿는다. 다음 회에서는 32비트 윈도우즈 프로그래밍을 간단히 배워볼 것이다. 그러나 직접 어셈블리어로 윈도우 프로그래밍을 하는 것은 단지 창 하나 띄워보는 정도로 그치고, IA-32의 메모리 관리방법에 좀더 중점을 두고 집필할 예정이다. 이쪽을 배우는 것이 좀더 여러분에게 도움이 될 것 같아서이다. 다음 회에는 좀더 흥미로운 주제로 여러분에게 다가갈 생각이다. 그럼 이만 줄이겠다.

  • "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:55 2006/07/10 00:55
    Posted by webdizen
    No Trackback No Comment

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

    Leave your greetings.

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

    «Prev  1 ... 1458 1459 1460 1461 1462 1463 1464 1465 1466 ... 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

    • 모형 만들기
    • 몽랑볼 볼리노
    • 강원대
    • 백업
    • 보드카
    • SQL Server 2005
    • 감옥
    • 스노우보드
    • Monitoring
    • 행정본관
    • Programming
    • 서부여행
    • join
    • Objects
    • Data File
    • 분산 프로세스
    • 웹디즌
    • 배드민턴
    • 심리 테스트
    • 워크샵

    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.