1581, 9/80 회원가입  로그인  
   commio
   http://rightoknow.tistory.com
   Assembly Language 에 대한 간략한 설명

http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&no=1347 [복사]


간혹가다가 언어에 대해서 궁금하시는 분들이 있어서 참고 하라는 의미에서
잠도 안오고 해서... 한글자 적어봄니다.

; #########################################################################

      .386
      .model flat, stdcall
      option casemap :none   ; case sensitive

; #########################################################################

      include \masm32\include\windows.inc
      include \masm32\include\gdi32.inc
      include \masm32\include\user32.inc
      include \masm32\include\kernel32.inc

      includelib \masm32\lib\gdi32.lib
      includelib \masm32\lib\user32.lib
      includelib \masm32\lib\kernel32.lib

; #########################################################################

      ;=============
      ; Local macros
      ;=============

      szText MACRO Name, Text:VARARG
        LOCAL lbl
          jmp lbl
            Name db Text,0
          lbl:
        ENDM

      m2m MACRO M1, M2
        push M2
        pop  M1
      ENDM

      return MACRO arg
        mov eax, arg
        ret
      ENDM

        ;=================
        ; Local prototypes
        ;=================
        WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
        WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
        TopXY PROTO   :DWORD,:DWORD

    .data
        szDisplayName db "Popup ListBox",0
        CommandLine   dd 0
        hWnd          dd 0
        hInstance     dd 0
        lpfnWndProc   dd 0

    .code

start:
        invoke GetModuleHandle, NULL
        mov hInstance, eax

        invoke GetCommandLine
        mov CommandLine, eax

        invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
        invoke ExitProcess,eax

; #########################################################################

WinMain proc hInst     :DWORD,
             hPrevInst :DWORD,
             CmdLine   :DWORD,
             CmdShow   :DWORD

        ;====================
        ; Put LOCALs on stack
        ;====================

        LOCAL msg  :MSG
        LOCAL Wwd  :DWORD
        LOCAL Wht  :DWORD
        LOCAL Wtx  :DWORD
        LOCAL Wty  :DWORD

        mov Wwd, 150
        mov Wht, 150

        invoke GetSystemMetrics,SM_CXSCREEN
        invoke TopXY,Wwd,eax
        mov Wtx, eax

        invoke GetSystemMetrics,SM_CYSCREEN
        invoke TopXY,Wht,eax
        mov Wty, eax

        szText szClassName,"LISTBOX"

        invoke CreateWindowEx,WS_EX_PALETTEWINDOW or WS_EX_CLIENTEDGE,
                              ADDR szClassName,
                              ADDR szDisplayName,
                              WS_OVERLAPPEDWINDOW or WS_VSCROLL or \
                              LBS_HASSTRINGS or LBS_NOINTEGRALHEIGHT or \
                              LBS_DISABLENOSCROLL, \
                              Wtx,Wty,Wwd,Wht,
                              NULL,NULL,
                              hInst,NULL
        mov   hWnd,eax

        invoke SetWindowLong,hWnd,GWL_WNDPROC,ADDR WndProc
        mov lpfnWndProc, eax

        invoke GetStockObject,ANSI_FIXED_FONT
        invoke SendMessage,hWnd,WM_SETFONT,eax,0

        jmp @123
          item1 db "This is item 1",0
          item2 db "This is item 2",0
          item3 db "This is item 3",0
          item4 db "This is item 4",0
          item5 db "This is item 5",0
          item6 db "This is item 6",0
          item7 db "This is item 7",0
          item8 db "This is item 8",0
          item9 db "This is item 9",0
          item0 db "This is item 0",0
        @123:

        invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item1
        invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item2
        invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item3
        invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item4
        invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item5
        invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item6
        invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item7
        invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item8
        invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item9
        invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR item0

        invoke ShowWindow,hWnd,SW_SHOWNORMAL
        invoke UpdateWindow,hWnd

      ;===================================
      ; Loop until PostQuitMessage is sent
      ;===================================

    StartLoop:
      invoke GetMessage,ADDR msg,NULL,0,0
      cmp eax, 0
      je ExitLoop
      invoke TranslateMessage, ADDR msg
      invoke DispatchMessage,  ADDR msg
      jmp StartLoop
    ExitLoop:

      return msg.wParam

WinMain endp

; #########################################################################

WndProc proc hWin   :DWORD,
             uMsg   :DWORD,
             wParam :DWORD,
             lParam :DWORD

    .if uMsg == WM_CLOSE

    .elseif uMsg == WM_DESTROY
        invoke PostQuitMessage,NULL
        return 0
    .endif

    invoke CallWindowProc,lpfnWndProc,hWin,uMsg,wParam,lParam

    ret

WndProc endp

; ########################################################################

TopXY proc wDim:DWORD, sDim:DWORD

    shr sDim, 1      ; divide screen dimension by 2
    shr wDim, 1      ; divide window dimension by 2
    mov eax, wDim    ; copy window dimension into eax
    sub sDim, eax    ; sub half win dimension from half screen dimension

    return sDim

TopXY endp

; ########################################################################

end start

보이십니까..?
저 위에 코드는 순수어셈블러를 가지고 간단한 팝업창과 리스트 아이템들을 출력하는...
아주 간단한 코드입니다.

자 여기서...
난 C언어좀 했다.
라고 하시는분들은 저게 무슨 어셈이야.. C랑 뭐가 다른데.. 하실텐데...
맞습니다.. 그게 맞아요.. - _-

위에 어셈문법은 masm32에서 지원하는 코드입니다.
왜 코드에... .if .elseif 와 같은 문법이 존재할까요..?
저건 어셈문법이 아닙니다.

매크로로서 masm32에서 지원해주는것일 뿐이지요..
그럼 왜 존재할까요..?
그야 어셈으로 프로그램을 짜기는 비효율적이기 때문에 최대한 편하게 할려고 한것이죠.

그랬더니.. 어떻게 됐습니까?
결과적으로 C언어와 비슷해졌습니다.
이것으로 보아 masm32는 일반적인 어셈문법에서 벗어나 C와 가까워 지려고 하는것을 볼 수 있습니다.

그럼..?

하고싶은 애기가 뭐냐고요..?

어셈으로 프로그램만들일 없습니다. ( 이게 결론임니다. )
그럼 어셈어셈 거리는데... 뭐냐고요..?

그건 고급기술을 사용하기위해..
C언어로 할수 있지만, ( 정말 C언어로 만들수 없어서 어쩔수없이 어셈을 사용하는 경우는 별로 없습니다. )
편의성을 위해서 어셈을 사용하는것이죠.

여기서 편의성이라고 하게되면 의문이 들지 모르겠지만..

C언어는 고급언어기 때문에 기본이라는게 있습니다.

모든 함수의 시작은 아실분들은 아시겠지만, 스택프레임형성을 시작으로 출발하고
마지막은 스택복귀가 주된 내용입니다.

이 부분을 사용하기 싫다면 어셈을쓰면되는겁니다. 아.. 이 부분도 굳이 어셈이 아니더라도 C로도 가능합니다.

하지만 C로하기에는 귀찮고 예측할 수 없다는게 문제죠..

한 예를 들어보겠습니다.

int buf;
int memory[MAX_MEMORY];
for( int i = 0 ; i < MAX_MEMORY ; i++ ){
   buf = memory[i];
   memory[i] ^= 0x12345678;
   buf ^= 0x1234567;
   if( buf == memory[i] ) break;
   memory[i] ^= 0x12345678;
}

이라는 코드가 있다고 하겠습니다.
자 이게 현대의 컴파일러는 어떻게 해석할까요..?
그냥 i만 카운트 할 가능성이 매우 높다는것을 말씀해드립니다.
어라? buf 랑 memory[i] 는 항상같네.. 라고 생각하는 우를 범할수 있습니다. ( 아니 우를 범함니다. )
그럼 우리는 원하는 목표를 당성하지 못하겠죠.. ( 컴파일 옵션을 이리저리 잘 조정하면 원하는 코드와 비슷하게
얻어낼수있을지도 모릅니다. )
하지만 그렇지 못하기에 보통 저런 코드들은 어셈으로 작성하죠.

너무 끼워맞춘코드 같다고요..?
저것과 비슷한 코드쓰는곳 의외로 있습니다.
생각이 안나서 그냥 저걸로했습니다만...

보통 위와 같은 용도로 C로 만들어지는 코드기는 하지만 힘들고 귀찮고 어떻게 될지도 잘 모르기 때문에
어셈을 이용해서 작성하게됩니다.

이제 어셈에 대해 좀 이해하셨나요..?
어셈은 무슨 강력한 무기거나 그렇지는 않습니다.
단지 C로는 생성하기 귀찮거나 혹은 힘들거나 하는 코드를 만들어내기위해 C를 보조하는것이지
주력이되는 경우는 거의 없습니다.
운영체제도 물론 C언어로 작성되었고요.. ( 리눅스, windows .. )

잘못된 부분이나 태클거실분은 거셔도 상관없습니다...
그 어떤 종류의 태클과도 마주할 자신이 있습니다.
설명 당신은 게이냐, 당신은 천재냐, 당신은 루저냐, 당신은 인간이냐, 당신은 ...
글씨체가 맘에들지 않는다, 말투가 4가지가 없다, 오타가 엄청많다.. 등등..
하지만 답변이 달리지 않을 수도 있다는 점 .. 기억하시면서...
지식에 태클거시면 답변은 최대한 빠르게 달도록하겠습니다. 저와 다른 상반된 의견도 감사히 받겠고요.

PS. BSOD 탈출 기념.. 파란화면과 싸우다 밤샜네요... 결국이겼으니 된거겠죠...ㅋㅋ

  Hit : 8448     Date : 2009/12/13 06:31



    
월월 이게 간략한 설명이라니 ㄷㄷ ;;

잘봤습니다 .. ㅎㅎ

그러면 어셈블리어로는 어떨떄 사용해야하죠?

어셈블리어도 배울껀데 ';
2009/12/13  
commio 글 내용에 적어뒀습니다. C가 아닌 어셈을 사용해야만 하는 경우와 C로도 되지만 편의성을 위해서 어셈을 사용하는 경우를요.
나름대로 어셈에대한 설명이라기보다는 어셈의 역할에대해 쓴것인데...
뭐 어셈은 리버싱하려면 필수긴하죠..ㅋㅋ
2009/12/13  
BkeMan 저기 질문잇는데요
c 언어는 vc++로 실행시키는데욤 어셈블리어를 할려면 어떤 프로그램을 실행시켜서 주로해요?
2009/12/13  
commio 글 내용에 나와있지만... 처음 접하시는 분들은 모르시겠죠...
참... ( 12월 13일 까지만 밤 12:00 가 지나면 더이상의 답변은 피하도록하고 그전까지는 친절히... )
위 내용에도 있지만... 어셈언어로 짜여진 프로그램을 컴파일 하기위해서는 masm32 ( windows 플랫폼에 특화되어있는 어셈블러 ) nasm ( 범용적으로 사용하는것이 목적인 어셈블러 ) 등등...
제가 아는것은 위 두가지 뿐임니다.. ( 젤 유명하거든요..ㅋㅋ )
저런것들은 어셈블러라고 불리며 어셈블리어를 컴파일해주는 컴파일러입니다.
'공짜'로 다운받고 사용하실수 있습니다. ㅋ
2009/12/13  
도깨비선생 글 잘 읽었습니다...
어셈 어셈...하며 목매지 말고 C언어를 100% 내것으로 만들어야 겠다는 생각이 들었습니다.
C언어를 예전에 조금 배웠고... 다시 C언어 공부를 하려고 하는데요...
C언어는 자료구조까지 나가는게 좋은가요???
자료구조 보다는... printf나 for문 같은 명령어가 컴퓨터 내부에서 어떻게 동작하는지...
이해와 방법같은걸 파고드는게 우선일까요???
2009/12/13  
commio 흠... 저같은 경우에는 C언어 포인터까지만 공부했습니다 ( 책보고는... )
나머지는 이것저것만들면서 남이 만들어놓은것 보면서 다배웠습니다..
덕분에 무슨 정렬알고리즘이라든지 자료구조라던지... 그런거 이름은 잘모름니다..
요즘에는 질문하는 사람들이 많아서 보다보니 알게되었지만...
C언어를 100% 자기것으로 만들 이유도 없습니다.
제 글의 핵심은 어셈어셈 한다고 어셈을 할 필요가 없는것이고..
자기가 현제 하고싶은게 무엇인지를 알고 그에 맞춰서 배워야한다는것입니다.
예로 웹페이지를 디자인하고 코딩하는 프로그래머가 되고싶은데 C언어를 할 필요가 없다는거죠..
각자가 자신이 원하는 분야가 있을텐데.. 기초는 C 라는 말만 듣고 관계없는 C를 배우는 우를 범하지 말아달라는것이죠...
어셈도 마찬가지입니다. 원하는게 무엇입니까?
무엇을 구현하고 싶습니까?
머릿속에있는걸 구현하려면 필요한게 무엇인지 인지하고 그에 필요한 지식을 쌓는것이 순서입니다.
그러나 안타깝게도 대부분 필요한게 무엇인지 인지하기보다는 남들하니깐, 기초라니깐 이라는 말도안되는 이상한 이유를 들어가면서 공부를 하더군요.. 그런식으로 공부하지 말아 달라는 것입니다.
먼저 무엇인가를 배우기전에, 내가 배워야하는 이유를 알아야한다는것이 중요하죠.
2009/12/13  
commio 이 세상에 목적없이 성공한 사람들 없습니다.
성공한 사람일수록 자신의 목표가 뚜렸을했을 뿐이지요.
finger의 취약점도 UFO의 진실을 알고싶다는 목표를 가지고, ( overflow )
linux도 자신만의 시스템을 갖고자 했던 것처럼..
목표가있다는것이지요...
지금 이글을 보고있는 분들은 목표가 있습니까?
그리고 그것이 뚜렸합니까? 그러기 위한 계획은 있습니까?
그 계획이 있다면 자신은 그 계획에 맞춰서 공부하면 될뿐입니다.
누가 뭐라고 하든 미친짓이라고 하든 자신만의 길을 만들어 나가세요.
그것이 진리입니다.
2009/12/13  
commio 게다가 전 질문게시판이나, 자유게시판에 질문성 글을 올리시는 모든 분들...
목표가 무엇인지 모르겠습니다. 남이 하니깐 나도해야지.. 라는 생각을 가지시는건가요..?
해커가 되고싶습니다.
정확하게 무엇이 되고 싶은지 알수 없습니다. 구체적으로 말해줄 수는 없는건가요..?
아직 잘몰라서 구체적으로 말할수 없다고요?
그건 절박하지 않아서 입니다. 원하지 않아서이기 때문이기도하겠죠.
뉴스에 해커 어쩌고... 취약점 어쩌고 저쩌고.. 누가 아이폰개발해서 돈을벌었네 어쩌네...
이것이 흥미를 일으켰습니까? 상관없습니다.
정말 그것이 중요하다고 느꼈고 해야될 일이라고 생각했다면,
해커가 어떤 사람들이고, 그들이 하는 일들이 무엇인지 알려고 얼마나 노력했습니까?
저같은 경우는 약 1달여간을 웹서핑을 해대면서 그와 관련된 자료를을 모으고 공부했네요.
제가 잘났다는것은 아닙니다.
그 모든것들이 마찬가지 이듯이, 노력없이 이룰 수 있는것은 절대 없습니다.
이 노력은 뚜렷한 목표의식이 있을때 비로서 제대로 발휘하는것인데 목표없이 남들하니깐..
이라는 마인드라면 당장 때려치우세요..
2009/12/13  
commio 이건 도깨비 선생님에게만 하는 말이아니고 이글을 읽는 모든 분들이 길고 지루하겠지만 읽었으면 하는 바램으로 적어 봄니다..
친절히 답변을 해주고 싶지만.. 도깨비 선생님께서 원하는것이 뭔지를 모르겠습니다.
목표를 모르겠다는것이죠... 구체적이라면 뭔가 답변을 드릴수 있겠지만... 킁..
제가 친절하게 답변을 다는 기간은 이제 3시간 30분도 안남았네요..ㅋㅋ
공부해야되는데... 우리나라 IT계의 발전을 위해 주절 거려봄니다...
2009/12/13  
도깨비선생 저에게 필요한 자극적인 말씀 주셔서 감사드려요...
공부가 우선이 아닌... 하고싶은게 뭔지... 부터... 찾고 그후에 공부를 해야겠네요...
그것도 모르고... Level문제 푸는데 눈이 뒤집혀 있었던것 같네요...
꾸벅~꾸벅~!
2009/12/13  
commio 마감~ 2009/12/14  
k1rha commio 님의 말에 절대공감합니다 ~
2009/12/14  
푸른하늘 정말 잘보고가요... 형은 모르는게 없어서 탈이라니까요...-_-..;;

저도 어셈어셈 거려서 어셈하려고했는데.. 일찌감치 이글보고 접었어요 ㅋ
C나 정말 깊숙히 들어가 봐야겠네요...
2009/12/14  
tseug 전 아직 멀었나보네요..
더 열심히 해야겠네요..ㅎㅎ;
2009/12/14  
kjwon15 저 소스는 혹시 OS만들때 메모리 테스트 코드?..
많이 본듯한 코드네요..
2009/12/24  
hock 좋은 글귀 감사합니다 2010/01/20  
dnr0400 좋은글 감사합니다...
commio님은 무슨목적으로 배우셧나요?? << 태클아니에요 그냥 궁금해서요 ㅠㅠ
나쁜뜻 절대 아니에요.
저도.. 목적에 대해 생각해야겠네요.
처음엔 그냥 컴퓨터가 신기해서 컴퓨터에 대해 자세히 알고싶다는.. 연유로 c언어를 배우기시작했지만....
2010/01/30  
Cpgroot 좋은글 감사합니다.. ㅇㅅㅇ 2010/08/18  
1421   익스플로러 창 타이틀바에 글씨 넣기~[4]     kgt2001sus
02/21 8486
1420   익스플로러/크롬/파이어폭스/ 윈도우/리눅스/맥킨토시등등[1]     lchk24
01/29 7176
1419   alsduddlrk12@hanmir.com 해킹가르쳐주실 스승분구합니다...[6]     st9203
02/05 6044
1418   임베디드 리눅스 공부방법[6]     hansu9
08/22 13158
1417   임베디드 시스템란?[3]     X-line
12/18 8531
1416   ARP스푸핑과 ARP캐시 포이즈닝의 차이점     alscjf7612
07/17 9232
1415   arp스푸핑에 관해[1]     alscjf7612
07/17 8137
  Assembly Language 에 대한 간략한 설명[18]     commio
12/13 8447
1413   저의 스승님을 구합니다[6]     hacs98
05/05 7147
1412   자주사용되는 리눅스 기본명령어[8]     rootguy
12/05 10611
1411   자유 게시판에 있는거 훔쳐서 포인트 올리기!! 잇힝~*[6]     a456753
11/19 8921
1410   자유강좌실 너무 황량해서 허졉한거 하나만올립니다.[8]     rkdgh0112
02/11 6806
1409   자유강좌실업그레이드합시다!!![2]     good7941
09/09 6700
1408   자격증 (문제)사이트 [2]     koreal33t
09/06 4192
1407   자격증 cissp 소개입니다.[2]     gnsehfvlr
05/09 7524
1406   저기요제가해킹을배울려고하는데뭐부터시작해야할지모르겠어요 ;;[4]     paaaaa7895
08/26 8782
1405   자동종료 아이콘 만들기[7]     dzhfldk
07/22 7399
1404   저랑 공부하실분[3]     hacs98
04/21 7296
1403   자료구조 강좌_자료구조의 기본 개념[1]     parkjy1917
08/31 8594
1402   자료구조 강좌_정렬     parkjy1917
08/31 8202
[1][2][3][4][5][6][7][8] 9 [10]..[80]

Copyright 1999-2024 Zeroboard / skin by Hackerschool.org / Secure Patch by Hackerschool.org & Wowhacker.com