본문 바로가기
Computer Science Study/Assembly Language

[A.Lang] 기본 template

by SeolLab. 2023. 3. 15.
728x90

A.L. 기본 템플릿.(X86 버전 기준. x64에선 안돌아감. )

; program template (Template.asm)
.386
.model flat,stdcall
.stack 4096
ExitProcess proto, dwExitCode: DWORD

.data
sum DWORD ?                     ; ? 어떤 값을 할당할지 미정이라는 뜻의 '?'
	; declare variable here 

.CODE 
main PROC 
	; write your code here 
	INVOKE ExitProcess, 0
main ENDP
END main

 

 

 

1. comment 달기 

1) ; 뒤는 모두 주석처리

 

 

2)  hi 
this code is all comments 이런식으로 주석 처리 가능.  사실 !가 아니라 어떤 문자여도 상관없다.(아 물론, ';'은 안된다. )

 

2)  .386 은 32-bit 초창기 버전 운영체제 기반 80386과 호완시킨다는 뜻. 

 

3) .model flat, stdcall 에서 

.model flat 은 directive로서, runtime 에 실행되는 부분이 아니며, CPU에서 실행되지 않는다. 

flat 하다는 건, flat한 메모리 모델을 이용한다는 뜻으로, 32-bit 주소와 32-bit 메ㄹ모리 공간을 그대로 가져와 쓰겠다는 말을 명시적으로 나타낸 것이다.(16-bit 메모리 공간을 이용할 때는 주소가 20-bit였기 때문에 16-bit짜리 segment와 16-bit짜리 offset을 붙여 주소를 표시했지만, 32-bit으로 확장된 다음부터는 그럴 필요가 없어졌다. 이와 동시에 segment의 기능도 바뀌게 되었고, segment는 코드와 명령어, stack을 저장하는 부분을 지칭하는 말이 되었다. 코드는 변수를 설정하고 그 변수의 type을 설정하는 부분으로, .code로 나타나 있고, 명령어(command)는 .data로 나타나있다. 마지막으로 stack은 .stack 으로 나타난다.)

 

※참고로 A.L.은 대소문자를 구분하지 않으며, python과 다르게 indented line의 의미가 없다.

 

stdcall 는 function call에 대한 convention과 같은 것으로써, stack에 역순으로 argument를 대입시키라는 의미를 가진다. 어째거나 이 명령 역시 runtime에 실행되지 않기에 CPU에서 실행되지 않는 directive로 분류된다. 

 

 

4)  .stack 4096의 경우 stack segment의 크기를 4096로 지정한다. 4096의 의미는 4096B를 의미하는데, 약 4KB만큼의 공간이다. 일반적으로 메모리에는 값이 순차적으로 저장된다고 생각하지만, 이는 순전히 가상 메모리 기준이고, physical memory는 비순차적으로 저장된다. 어째든 가상 메모리는 page table이라고 하고 각각의 공간을 page라고 하는데 이 page 공간의 크기가 4096B에 해당한다. 

 

 

5) ExitProcess proto, dwExitCode: DWORD

이건 prototype 과 같다. ExitProcess procedure(함수와 비슷하지만 보다 더 원시적인 형태. 기능은 함수와 같다.)의 프로토타입을 명시한 거다. dwExitCode: DWORD는 이 ExitProcess Procedure 반환하는 값의 타입을 지정해 준다. DWORD는 double word라는 뜻으로, word(16-bit)가 두 번, 즉, 32-bit에 대응된다. 이렇게 prototype을 지정해줘야 뒤에 등장하는  INVOKE ExitProcess, 0

코드가 정상수행된다. 여기서 0이 반환값이다. 

C/ C++의 int main() 함수가 return 0;를 하는 것과 같은 원리다. 

추가로, C/C++에서도 함수를 정의하기 전에 프로토타입을 선언하는데, 프로토타입과 함수 정의는 각각 헤더파일과 소스파일에 저장된다. 여기서도 마찬가지임을 기억하라. 

 

6) main ENDPEND main  차이

main ENDP는 procedure의 종료를 의미하는 반면 , 

END main 은 program의 종료를 의미한다. 결국 프로그램의 entry point (시작점)이 main임을 다시한번 상기시키는 효과가 있다. 

댓글