수안이의 컴퓨터 연구실

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

Programming/Assembly2006/07/10 00:42

스트링 비교 예제, 이차원 배열, 베이스-인덱스 디스플레이스먼트

스트링 비교 예제, 이차원 배열, 베이스-인덱스 디스플레이스먼트

  • 스트링 비교 예제

    간단한 예제를 하나 소개하고자 한다. 두 스트링을 비교하는 예제인데, 반드시 두 스트링의 길이가 같아야 한다. 두 스트링 중 첫번째 것이 작으면 "Source is smaller"라는 문자열을 출력하고, 그렇지 않으면 "Source is not smaller"라는 문자열을 출력하게 된다.

    INCLUDE Irvine32.inc .data source BYTE "INTERNET " dest BYTE "INTERNETCOM" str1 BYTE "Source is smaller", 0dh, 0ah, 0 str2 BYTE "Source is not smaller" 0dh, 0ah, 0 .code main PROC cld mov esi, OFFSET source mov edi, OFFSET dest mov ecx, LENGTHOF source repe cmpsb jb source_smaller mov edx, OFFSET str2 jmp done source_smaller: mov edx, OFFSET str1 done: call WriteString exit main ENDP END main

    대부분 앞에서 설명한 내용이므로 굳이 세세히 설명하지 않아도 될 것 같다. 다만, 비교하다가 중지된 경우 분기를 해준다는 것이 조금 다르다. 공백의 아스키 코드 값 보다 'C'의 아스키 코드 값이 더 크므로 수행시 "Source is smaller"라는 문자열이 출력될 것이다. .data부분에 선언된 것 중 str1과 str2 뒤에 0dh와 0ah는 캐리지리턴과 라인피드로 개행문자이다. WriteString이라는 프로시져를 호출하는 부분이 있는데, 파라미터로 edx에 문자열의 주소를 받는다. 따라서 경우에 따라서 알맞는 스트링의 주소를 edx에 넣어두고 WriteString 프로시져를 호출함으로써 화면에 문자열을 출력할 수 있다. 앞으로도 잘 모르는 프로시져가 나오면 이름과 문맥을 살펴보고 의미를 파악하면 되므로 당황하지 않길 바란다.

  • 나머지 스트링 인스트럭션들

    이제 대충 감을 잡았을 테니 나머지 인스트럭션들은 잡다한 설명을 제외하고 어떻게 쓰는지, 어떤 경우에 사용하면 좋을지를 설명하겠다.

    scasb, scasw, scasd는 scan string의 약자로서 역시 비교를 한다. 하지만 여기서는 esi를 사용하지 않고 al 또는 ax 또는 eax 를 이용하고, 이곳에 있는 값과 edi가 가리키는 곳의 값을 비교하게 된다. 물론 비교 후에는 방향플래그에 따라 edi에 있는 주소값을 증가 또는 감소시킬 것이다.
    이것은 주로 문자열 내에 특정 문자가 있는지 확인할 때, 배열 내에 특정 자료와 일치하는 것이 있는지 확인할 때 편리하게 쓰인다. 특히, 널종료 문자열에서 문자열의 맨 끝으로 이동하려 할 때 유용하게 쓰일 수 있다.

    stosb, stosw, stosd는 store string의 약자로서 자료를 복사하는 역할을 하므로 movs종류와 유사한 일을 한다. 다만 읽어오는 곳이 al 또는 ax 또는 eax이라는 점이 다르다. 여기서도 esi는 쓰이지 않는다. 따라서 al/ax/eax로부터 값을 읽어들여 edi가 가리키는 곳에 쓰게 될 것이다.
    특정 문자로 스트링을 채우려고 할 때 rep접두어와 함께 사용하면 편리할 것이다.

    lodsb, lodsw, lodsd는 load string의 약자로서 자료를 복사하는 역할을 하므로 movs종류와 유사한 일을 한다. 다만 쓰는 곳이 al 또는 ax 또는 eax라는 점이 다르다. 물론 읽어오는 곳은 esi이며, edi를 사용하지 않는다. stos종류와 정 반대의 일을 한다고 생각하면 될 것이다. lods종류는 rep 접두어를 붙여서는 큰 쓸모가 없을 것이다. 왜냐하면 al/ax/eax에 복사되는 자료들이 반복되어봤자 계속해서 덮어 써지기 때문이다. 따라서 이 인스트럭션들은 loop인스트럭션과 함께 사용하는 것이 편리하다.

  • 이차원 배열

    이차원 배열이 무엇인지는 다들 잘 알 것이라 믿는다. 쉽게 말해서 엑셀에 행과 열에 따라 넣은 자료들과 같은 형태라고 생각하면 된다. 그런데 컴퓨터에서 이 이차원 배열을 사용하려면 생각처럼 쉽지 않다. 메모리는 '선형'이기 때문이다. 즉, 메모리에서는 자료를 일렬로 쭉 늘여놓은 형태로 사용한다. 그런데 이것을 마치 행과 열의 평면에서 자료를 다루는 것처럼 사용해야 하니 이것저것 생각할 것이 생기게 되는 것이다. 다음과 같이 자료를 정의해 두었다고 하자.

    .data tableB BYTE 10h, 20h, 30h, 40h, 50h BYTE 60h, 70h, 80h, 90h, 0A0h BYTE 0B0h, 0C0h, 0D0h, 0E0h, 0F0h NumCols = 5

    위와같이 이차원 배열을 정의할 수 있다. 아랫줄의 NumCols는 기호상수로서 이것을 정의한 것 아래에서 NumCols라고 적으면 5로 치환된다. 그렇다면 이차원 배열은 어떻게 사용하면 될까? 다음의 예를 통해서 하나하나 뜯어보자. 그림 1도 참고하면 좀더 이해하기 쉬울 것이다. 아래의 예제는 C에서의 이차원배열로 치자면 tableB[1][2]에 접근하는 예이다.(인덱스는 0부터 시작하는데 주의하라! 일반적으로 행과 열번호에 따라 말하자면 2행 3열이다.)
    RowNumber = 1 ColumnNumber = 2 mov ebx, OFFSET tableB add ebx, NumCols * RowNumber mov esi, ColumnNumber mov al, [ebx + esi]

    < 그림 1 : 이차원 배열>

    먼저 접근하고 싶은 행과 열을 각각 RowNumber와 ColumnNumber에 넣어두었다. 그리고 ebx에 테이블의 시작주소를 넣었고, ebx에 해당 열까지 옮긴 후(add인스트럭션으로) esi에 접근하고 싶은 열의 숫자를 넣어두었다. 그리고 마지막으로 [ebx + esi]에 접근함으로써 tableB[1][2]에 있는 값을 al로 복사하는데 성공하였다. 코드를 수행한 후에 al에는 80h가 들어가 있을 것이다. 그림1을 참고하면 좀 더 이해가 빠르리라 믿는다.

  • 베이스-인덱스 디스플레이스먼트

    이차원 배열을 다루기 위해 쓰는 두번째 방법이다. 만약 이차원 배열의 시작부분이 table이라고 하면, table[ebx + esi]와 같은 식으로 사용하는 방법이다.(table[ebx + esi]는 [table + ebx + esi]와 같은 의미이다. 이 부분이 이해가지 않으면 4회를 다시 보기 바란다. 물론 반드시 ebx와 esi일 필요는 없으니, 그때그때 비어있는 레지스터를 활용하기 바란다.) ebx에는 '행'과 관련된 정보가 있고, esi에는 '열'과 관련된 정보가 들어있을 것이다. 그런데 어떻게 들어있느냐가 궁금할지 모르겠다. 다음의 예제와 그림 2를 참고하면 좀더 이해가 빠를 것이다.

    .data tableB BYTE 10h, 20h, 30h, 40h, 50h BYTE 60h, 70h, 80h, 90h, 0A0h BYTE 0B0h, 0C0h, 0D0h, 0E0h, 0F0h NumCols = 5 .code mov ebx, NumCols mov esi, 2 mov al, tableB[ebx + esi] ; [150 + 5 + 2] = [157]

    < 그림 2 : 베이스-인덱스 디스플레이스먼트>

    이차원 배열을 사용하는 첫번째 방법과 다른 점은, 주소 자체를 갖고 있는 것이 아니라, 오프셋만을 계산한 뒤에 배열에 접근한다는 것이다. 물론 인스트럭션 수는 두번째 것이 좀 더 적지만, 첫번째 것이 좀 더 이해하기는 편할 것이다. 각자 취향대로 필요에 따라 사용하길 권한다.

  • "Assembly" 카테고리의 다른 글
    • 구조체란? 구조체 선언, 구조체 변수 사용하기 (0)2006/07/10
    • 버블소트 (0)2006/07/10
    • 스트링 비교 예제, 이차원 배열, 베이스-인덱스 디... (0)2006/07/10
    • 스트링관련 인스트럭션들, REP 접두어, 방향 플래... (0)2006/07/10
    • 프로시져 호출 규약, LEA 인스트덕션 (0)2006/07/10
    2006/07/10 00:42 2006/07/10 00:42
    Posted by webdizen
    No Trackback No Comment

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

    Leave your greetings.

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

    «Prev  1 ... 1473 1474 1475 1476 1477 1478 1479 1480 1481 ... 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

    • 실체화
    • Opera
    • 모니터링 매커니즘
    • Iterator
    • T-SQL
    • 철학
    • STL
    • 대학원
    • exception
    • 데이터 타입
    • 여성
    • 약한 참조
    • 노틀담
    • Weblog
    • 삼성
    • TED
    • nmap
    • processor
    • Bitmap ImageList
    • 미러링

    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.