본문 바로가기
IT/Assembler

[ASM]프로토타입 프로그램

by Jang HyunWoong 2014. 12. 19.

page   58, 132 ; 58개의 행과 132개의 문자가 있다, 어셈플리스트 파일을 만들기 위한 명령어.

title    display -prototype program ; 각페이지마다 출력될 제목을 붙여줌.

.286              ; .286이라는 명령어가 있으니 처리하라는 명령어.

sseg segment stack   ; stack 세그먼트의 시작.

DB 32 dup ("Stack---")  ;  db-스택을 위해 메모리 공간확보 명령어, 32byte기억장소 확보 ("stack---") ->8바이트 그래서 256을 확보하려면 8*32=256.

sseg ends  ; stack 세그먼트의 끝.

 dseg  segment   ; 데이터 세그먼트의 시작

Message db "Hello" , 0ah, 0dh   ; 메세지를 Message로 정의 ah,dh는 줄바꿈(ah,dh 는 문자로 시작하기 때문에 앞에 반드시 0을 붙여줘야한다. )

L_message equ $-message  ; 사용가능한 데이터오프셋($)에서 message에 저장된 오프셋을 빼서 구해진 문자열의 길이를 L_message로 정의 한다

dseg ends   ;데이터 세그먼트의 종료.

cseg segment 'code'   ;코드 세그먼트의 시작, 코드 세그먼트로 정의 할때 segment 지시어로 'code'를 사용하여야 한다.

assume    cs:cseg, ss:sseg, ds:dseg   ; 주소입력, 레지스터가 가질 값을 어셈블러에게 알리고 그 실제 값을 갖도록 해준다.

main  proc  far  ; 프로시저 정의 , 메인프로시저 시작 far는 외부 세그먼트에서 시작할 수 있음을 의미.

push ds ; 데이터 세그먼트에 ds푸쉬 sp레지슽 -2감소,

push 0   ; 이 두 부분은 dos로 돌아가기 위해 주소값을 초기화하는 부분을 stack에 미리둔다 stack는 LIFO 선입후출 구조 이기 때문에 미리 stack에 데이터를 넣는다.

 

mov ax, dseg  ; 데이터 세그먼트를 어큐물레이터(전송및연산에사용)에 넣는다.

mov ds, ax     ; dseg->ds에 바로 넣을 수 없기때문에 어큐물레이터를 통해 데이터 세그머트를 전달한다.

mov bx, message ; message를 베이스레이스터에 넣는다.

mov cx, L_message  ; 카운터레지스터에 $-message(message의길이)를 복사한다.

mov ax, 40h   ; 어큐물레이터에 도스호출 번호 40h를 복사한다.

int 21h   ; 인터럽트 21h를 요청한다. (메세지 출력)

ret   ; 호출한 프로시저로 복귀, 도스로 돌아간다.

main endp   ; 메인 프로시저 종료 .

cseg ends   ; 코드세그먼트 종료.

end main ; 전체 프로그램 종료.

반응형