본문 바로가기

Programming Language/Assembly

첫 예제: 1개의 문자 출력

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
MASM 어셈블리 코드는 다음과 같은 기본 뼈대를 갖습니다.
.386
.model flat, stdcall
stack segment para stack
	db 1024 dup(?)
stack ends
data segment
data ends
code segment
	main proc far
	main endp
code ends
end main
이를 좀 더 단순화하면
.386
.model flat, stdcall
.stack 1024
.data
.code
main proc
main endp
end main
.386

.386 지시어는 386 CPU를 위한 명령어들만 사용한다는 의미입니다. 286, 486, 586p 등 다양한 지시어를 사용할 수 있고 여기에 지정한 CPU에 따라 사용할 수 있는 명령어가 달라지고, 메모리 주소와 관련해서 오퍼랜드의 크기가 달라질 수 있습니다.

.model flat, stdcall

.model 지시어는 메모리 모델을 지시합니다. MSDN(http://msdn.microsoft.com/en-us/library/ss9fh0d6%28VS.80%29.aspx)에 따르면 다음과 같이 레퍼런스가 소개되어 있습니다.

.MODEL memorymodel [[, langtype]] [[, stackoption]]

memorymodel에는 TINY, SMALL, COMPACT, MEDIUM, LARGE, HUGE, FLAT이 올 수 있고,
langtype에는 C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL이 올 수 있습니다.
stackoption은 memorymodel이 FALT인 경우에는 지정할 수 없고 그 외에는 NEARSTACK 또는 FARSTACK이 올 수 있습니다.
메모리 모델에 대해서는 나중에 기회가 되면 정리하도록 하지요

.stack 1024

.stack 지시어는 스택의 크기를 지정합니다. 기본 크기는 1024바이트 입니다.

.data

.data 지시어 아래로는 명령어는 아니지만 프로그램 진행에 필요한 각종 데이터들(바이트 배열, 문자열 등)을 선언하는 곳을 나타냅니다. 아직은 쓸 단계가 아니니 비워두지요,

.code
main proc
main endp
end main

.code 지시어 아래로 본격적인 명령어들이 시작합니다.
code 영역에는 다수의 프로시저(C언어에서 말하는 함수에 해당하는 것)가 존재하고 가장 마지막 줄에 end 명령어 이후에 나온 위치가 프로그램 실행시 진입점 역할을 합니다.
달리 말하면 C언어에서는 진입점이 main (WinAPI에서는 WinMain)이어야 했지만, 어셈블리에서는 꼭 main일 필요가 없다는 것이죠.

그럼 진짜로 간단한 어셈블리어 예제를 작성해 보겠습니다.

; 어셈블리어에서 주석은 세미콜론(;)입니다.
.386 ; 386 CPU용 명령어들을 사용합니다.
.model flat, stdcall ; 메모리 모델은 stdcall을 사용합니다.
.stack 1024
.data ; 데이터 영역은 아직 없으므로 비워둡니다.
.code ; 코드 영역 시작
main PROC ; main 프로시저 선언합니다.
	MOV DL, 48h ; DL 레지스터에 아스키문자 'H' (0x48)를 넣습니다.
	MOV AH, 02h ; AH 레지스터에 문자 1개를 출력하는 명령인 02h를 넣습니다.
	INT 21h ; MS-DOS API 인터럽트 21h를 발생시켜 AH, DL에 담긴 내용대로 처리합니다.

	MOV AH, 4Ch ; AH 레지스터에 프로그램을 종료하고 도스로 돌아가는 명령인 4Ch를 넣습니다.
	INT 21h ; 다시 만능 인터럽트 21h를 발생시켜 프로그램을 끝내고 도스로 돌아갑니다.
main ENDP ; main 프로시저의 끝입니다.
END main ; 프로그램 선언은 여기서 끝내고 main 프로시저로 진입합니다.


1. File-New를 선택해 위와 같이 코드를 작성하고

 


2. C:\main.asm으로 저장합니다.



3. Run-Execute 메뉴를 선택합니다.



4. 현재 상태를 빌드하고 실행할 거냐고 묻습니다. 소스 파일을 실행 파일로 만들기 위해 Build Target을 선택합니다.



5. 첫 번째 예제가 완성되었습니다. 화면에 알파벳 H가 출력되고 정상 종료되었습니다.



'Programming Language > Assembly' 카테고리의 다른 글

점프 명령어 JMP  (0) 2013.04.06
두 번째 예제: Hello, World!  (0) 2013.03.31
MASM PWB 사용하기  (0) 2013.03.31
MASM 설치하기 (MS-DOS 버전)  (0) 2013.03.31
MS-DOS API로 배우는 어셈블리어  (0) 2013.03.31