- 메세지 박스 사용하기 -
1. include 사용 방법 (masm32 폴더안의 여러 라이브러리를 사용할수 있다. )
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
windows.inc 를 include 하면 에러가 나는데 winextra.inc 파일의 밑의 폴더에서
위의 대괄호 지우면 정상작동 한다 .
2.프로토 타입
함수의 프로토 타입을 먼저 선언해야지 함수가 늦게 선언되더라도 코드에는 아무 문제 없다.
FunctionName PROTO [ParameterName]:DataType,[ParameterName]:DataType,...
(프로토 타입 선언 방법)
ex) ExitProcess proto uExitCode:DWORD
- eixti() 함수와 동일
- 어셈블리 언어에서 함수를 부를수 있는 방법은 call 과 invoke 가 존재 하는데 call 의경우 함수에 보내는 매개변수의 갯수가 다르더라도 인식하지 못하지만 invoke 의경우 인식할 수 있어서
invoke 함수의 사용을 권장한다.
하지만 이러한 기능을 제공하기 위해서는 invoke 로 함수를 불러네기 전에 함수의 프로토 타입을 먼저 정의 해야한다.
3. include vs includelib
include 는 미리 만들어진 라이브러리를 가져온다.
하지만 includelib 은 사용하고 있는 포함 라이브러리가 무엇인지 알려줍니다.
4. 코드 해설
.386
.model flat,stdcall
option casemap:none ; 어셈블러가 대소문자를 구분할수 있게 해준다.
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
.data
MsgBoxCaption db "Iczelion Tutorial No.2",0
MsgBoxText db "Win32 Assembly is Great!",0
.code
start:
invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK
invoke ExitProcess, NULL
end start
db : 일단 지금은 데이터를 저장하는 명령어라고 생각
"Iczelion Tutorial No.2",0 문자열의 끝은 항상 0 을 가지고 있어야함
addr: 레벨의 함수 주소를 전단하기 위해서
addr MsgBoxText 는 MsgBoxText 의 주소를 전달한다.
MB_OK 미리 정의된 변수 값으로 OK 메세지 박스 출력
ml.exe 를 이용해서 실행 파일 생성하기 (visual studio 안쓰고)
위의 코드를 main.asm 으로 저장한후 ml.exe 파일이 있는 폴더에 넣는고 실행한다.
cmd 창으로 위의 명령어를 실행해보자 (ml /c /coff /Cp main.asm)
- 명령어 설명
/c : 어셈블리만 하도록 한다. ( 링크작업을 하지않음)
/coff : obj 파일을 COFF 포멧으로 만든다.
/Cp : 식별자의 대소문자를 구별하도록 한다.
폴더 내에서 main.obj 파일이 생성된것을 볼수 있다.
바로 다음으로 이 파일을 link 해보자
link /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm32\lib main.obj
- 명령어 설명
/SUBSYSTEM:WINDOWS : 실행 순서를 알려줌
/LIBPATH:c:\masm32\lib : link 가 포함시켜야 할 라이브러리들이 어디있는지 알려준다.
위와 같이 main.exe 실행 파일이 생성 되었다. 더블클릭하면 메세지 박스가 뜬다 .
'공부,일 > 어셈블리' 카테고리의 다른 글
listing 파일 만들기 (0) | 2021.08.16 |
---|---|
튜토리얼 3 simple window (0) | 2021.08.16 |
튜토리얼 1 (0) | 2021.08.13 |
__cdecl vs __stdcall (0) | 2021.08.13 |
masm32 기본 다지기 튜토듀얼 블로그 (0) | 2021.08.13 |
댓글