외로운 Nova의 작업실

Assembly 언어 공부 - 6(tutorial-demo1) 본문

Programming/Assembly

Assembly 언어 공부 - 6(tutorial-demo1)

Nova_ 2022. 5. 23. 21:53

안녕하세요. 오늘은 저번시간에이어 masm32파일에 담겨 있는 tutorial 파일에대해서 알아보겠습니다.

원래는 책에대해서 공부를 해야하는데... 책에 helloworld를 찍는 프로그램 예제가 없었습니다.

그래서 구글링도하고 이것저것 알아보던중에 masm32파일에 tutorial 파일이 있는걸 알게되었습니다.

이 해당 파일에는 window가 아니라 콘솔에 출력할 수 있는 코드도 가지고있고, 간단한 프로그램도 예제로 있어서 소개해볼까합니다.

demo7까지 끝낸다음 어셈블리어 책을 정리하면서 예제도 만들어보면서 재밌게 공부해볼까합니다.

사실 프로그래밍은 예제만들기가 짜릿하죠..!

그럼 시작해보도록 하겠습니다.

 

<masm32 - tutorial>

먼저 저희가 받은 masm32 파일 폴더에 직접 들어가게되면 아래와 같이 뜹니다.

저기 맨밑에 tutorial이라고 써져있는 파일에 들어가보게되면,,

맨위에 console 파일에 들어가줍시다.

console파일안에는 demo1~7까지 간단한 프로그램이 종류별로 들어가 있습니다.

먼저 demo1부터보고 7까지 봐보겠습니다.

 

<tutorial - demo1>

먼저 demo1에 들어가보게되면,,

hello.asm 어셈블리 파일이 보이게됩니다.

이 asm파일을 masm32 code editor로 열게되면,,

이러한 파일이 뜨게됩니다.

먼저 코드를 긁어와보겠습니다.

; カカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカ?

;                 Build this with the "Project" menu using
;                       "Console Assemble and Link"

; カカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカ?

    .486                                    ; create 32 bit code
    .model flat, stdcall                    ; 32 bit memory model
    option casemap :none                    ; case sensitive
 
    include \masm32\include\windows.inc     ; always first
    include \masm32\macros\macros.asm       ; MASM support macros

  ; -----------------------------------------------------------------
  ; include files that have MASM format prototypes for function calls
  ; -----------------------------------------------------------------
    include \masm32\include\masm32.inc
    include \masm32\include\gdi32.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc

  ; ------------------------------------------------
  ; Library files that have definitions for function
  ; exports and tested reliable prebuilt code.
  ; ------------------------------------------------
    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\gdi32.lib
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib

    .code                       ; Tell MASM where the code starts


start:                          ; The CODE entry point to the program

    print chr$("Hey, this actually works.",13,10)
    exit

end start                       ; Tell MASM where the program ends

각 코드마다 ;옆에 주석이 달려있습니다. 

튜토리얼 모드이다보니 이해하기 쉽게 써져있습니다.

주석으로 한글로 바꿔서 코드를 재작성해보겠습니다.

; カカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカ?

;                 Build this with the "Project" menu using
;                       "Console Assemble and Link"

; カカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカ?

    .486                                    ; 32bit 코드를 사용합니다.
    .model flat, stdcall                    ; 32 bit 메모리 모델입니다.
    option casemap :none                    ; 대소문자를 구별합니다.
 
    include \masm32\include\windows.inc     ; 항상 처음에 써줘야합니다.
    include \masm32\macros\macros.asm       ; masm을 도와주는 메크로들이 있습니다,

  ; -----------------------------------------------------------------
  ; 함수 호출을 위한 MASM 형식 프로토타입을 포함하는 파일입니다.
  ; -----------------------------------------------------------------
    include \masm32\include\masm32.inc
    include \masm32\include\gdi32.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc

  ; ------------------------------------------------
  ; 함수에 대한 정의가 있고 사전에 빌드된 코드가 들어있는 라이브러리 파일입니다.
  ; ------------------------------------------------
    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\gdi32.lib
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib

    .code                       ; MASM에게 code의 시작부분을 알려줍니다.


start:                          ; 프로그램의 엔트리포인트 코드입니다.

    print chr$("Hey, this actually works.",13,10) ;콘솔에 "Hey, this actually works+ 아스키코드 13, 10을 출력합니다.
    exit

end start                       ; MASM에게 프로그램이 끝났다고 알려줍니다.

위 코드를 주석과 함께 읽으시면 도움이 되실겁니다.

특히나 print는 macros.asm에 메크로가 걸려있습니다.

이를 확인해보면,

 

위와 같습니다.

MACRO 명령문의경우엔 print문을 찾아서 아래와 같은 명령문으로 바꿔주는 명령문입니다.

예를 들어hello.asm에서 print라는 문자열을 찾고 만약에 __UNICODE__ 가 정의가 안되었다면 print 문자열을 invoke StdOut, expand_profix(reparg(arg1))으로 바꿔줍니다.

또한 이 StdOut함수는 masm32.inc 파일에서 찾을 수 있습니다.

StdOut의 정의는 masm32.lib에 바이트코드로 정의되어있습니다.

즉, 기계어로 정의되어있다보니 정확히 어떻게 동작하는지는 알기 어렵습니다.

다만, 주석에 나와있듯이 콘솔에출력하는 함수인것을 알 수 있습니다.

이제 demo1파일 아래에 있는 exe파일을 실행 시켜봅시다.

해당 문자열이 출력이 잘 된것을 볼 수 있습니다.

한번 문자열을 변경해서 출력해보겠습니다.

저는 hello world로 변경해보겠습니다.

; カカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカ?

;                 Build this with the "Project" menu using
;                       "Console Assemble and Link"

; カカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカカ?

    .486                                    ; create 32 bit code
    .model flat, stdcall                    ; 32 bit memory model
    option casemap :none                    ; case sensitive
 
    include \masm32\include\windows.inc     ; always first
    include \masm32\macros\macros.asm       ; MASM support macros

  ; -----------------------------------------------------------------
  ; include files that have MASM format prototypes for function calls
  ; -----------------------------------------------------------------
    include \masm32\include\masm32.inc
    include \masm32\include\gdi32.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc

  ; ------------------------------------------------
  ; Library files that have definitions for function
  ; exports and tested reliable prebuilt code.
  ; ------------------------------------------------
    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\gdi32.lib
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib

    .code                       ; Tell MASM where the code starts


start:                          ; The CODE entry point to the program

    print chr$("Hello world.",13,10)
    exit

end start                       ; Tell MASM where the program ends

print 함수 문자열을 위 코드와 같이 Hello world로 바꾼뒤 컴파일과 링크를 휴 실행시켜보겠습니다.

Hello world가 잘 출력되는 것을 확인 할 수 있습니다.

Comments