크리에이티브 커먼즈 라이센스

홈페이지HOME

PHP

JavaScript

HTML

CSS

드롭다운메뉴

제로보드4

도   움   말

백지 건강강좌/자가임상체험

물박사(자가면역질환...)^미러

전동명(천연물질사전)^미러

竹田 장승옥(블로그)^글목록

계산환산(계산기)^ 단위변환

관주성경 TTS 일반파일 TTS

바이블로 Bible_ro 다운로드

다운로드>폰에 복사
>파일선택...설치됩니다.

[도움말 보기] 바로가기

개선 요구, 충고는
아래 관리자 연락
전화/메일 부탁 드립니다.
최대한 빨리 처리하고
업데이트 올리겠습니다.


asm_91.


서브루틴


     44 이형문 k2mul  01/23

    994 16 서브루틴......



서브루틴이란,프로그램 중에서 여러번 되풀이 사용되는 부분을 메인

루틴

으로 부터 독립하여 작성하는 것입니다.


서브루틴은 서브루틴의 시작을 알리는 나타내는 라벨이름으로 시작하고

 서브루틴의

끝을 나타내는 RET 명령으로 끝납니다.

서브루틴을 부를때는 CALL명령 다음에 서브루틴의 시작에 붙여진 라벨이름

 을 사용합니다.






* 0부터 까지의 숫자를 출력하는 프로그램입니다. 단,한 자 한 자 출력하는

서브루틴을 만들어 호출한다.


CODE  SEGMENT

ASSUME CS:CODE

;

MOV CX,0

NEXT: CALL SUB1 ;서브루틴

SUB1을 부름

INC CX

CMP CX,10

JB NEXT

MOV AH,4CH  ;프로그램을

 {냄

INT 21H

;

SUB1: MOV DX,CX ;서브루틴의

시작을 알리는 라벨이름 SUB1

CX

의 값이 변경되지 않도록 DX 로 전송

ADD DL,'0'  ;0-9의

숫자를 아스키 코드의 '0'-'9'로 변환

MOV AH, 2 ;디스

플레이에 1 문자를 표시하라

INT 21H

RET ;메인루틴으로

되돌아 가는 명령

CODE  ENDS

 END






* AL 레지스터 내의 값을 16진수로서 화면에 표시하는 프로그램


AL 레지스터 내의 값 3FH를 16 진수로서 화면에 표시하려면 ,

"3" 과 "F" 와의 2가지 문자를 출력하지 않으면 안됩니다.

이때문에

AL 레지스터의 내용을 상위 4비트와 하위 4비트로 나누어서,2번에

걸쳐 출력하지 않으면 안됩니다.


CODE  SEGMENT

ASSUME  CS:CODE,DS:CODE

;

MOV AX,CODE

MOV DS,AX

;

MOV AL,3FH

CALL PUTAL


MOV AH,4CH

INT 21H

;이 서브루틴은 AL 레지스터의 윗자리,아래자리로 분리하는 서브루틴

PUTAL:  MOV BL,10H  ;

MUL BL  

MOV LEVEL2,AH

MOV AH,0

MOV BL,10H

DIV BL

MOV LEVEL1,AL

MOV DL,LEVEL2

CALL PUTHEX

MOV DL,LEVEL1

CALL PUTHEX

RET

;이 서브루틴은 DL 레지스터의 값을 대응하는 아스키코드를 출력

PUTHEX: CMP DL,0AH  ;0-9 까지의 숫자에 대응하는

아스키코드와

JAE HEX2 A-F

까지의 숫자에 대응하는 아스키코드가 연속

ADD DL,'0' 되어

있지 않으므로

JMP HEX3

HEX2: ADD DL,'A'-0AH

HEX3: MOV AH,2

INT 21H

RET


LEVEL2  DB  ?

LEVEL1  DB  ?

;

CODE  ENDS

END






 PROC에 의한 서브루틴의 구조화


서브루틴을 보다 구조적으로 표현하기 위해서 프로시듀어(procedure)

명령에 의해 서브루린의 앞뒤를 명시하도록 합니다.


SUB1: ....  ----> SUB1

 PROC

....  ........

....  .........

RET RET

SUB1

 ENDP






*  키보드로 부터 ASCII 코드를 입력하여 이 코드에 해당하는

 ASCII문자 출력 프로그램


CODE  SEGMENT

ASSUME CS:CODE

CR  EQU 0DH ;carriage return 코드는

0DH

LF  EQU 0AH ;Line Feed  코드는

0AH

NEXT: CALL GETAL  ;프로시듀어 GETAL을

호출

JC EXITP  ;에러이면

(캐리가 세트(1)되어 있으면) 끝냄.

MOV DL,AL

CALL PUTASC

JMP NEXT

EXITP:  MOV AH,4CH

INT 21H

; 키보드로부터 입력된 2개의 아스키 코드를 숫자로 변환하여 AL에 저장

; 시키고 돌어오는 서브루틴

GETAL PROC

MOV AH,1

INT 21H

CALL CVTAL

JC GETEND

MOV DH,AL

MOV AH,1

INT 21H

CALL CVTAL

JC GETEND

MOV DL,AL

MOV BH,10H

MOV AL,DH

MUL BH

ADD AL,DL

GETEND: RET

GETAL ENDP

;GETAL로 부터 호출된 서브루틴에서 아스키코드를 숫자로 변환하는 루틴.

CVTAL PROC

CMP AL,'0'

JB ERR1

CMP AL,'9'

JA SKIP1

SUB AL,'0'

JMP SKIP2

SKIP1:  CMP AL,'A'

JB ERR1

CMP AL,'F'

JA ERR1

SUB AL,'A'-0AH

SKIP2:  CLC  ;에러가 없으면

캐리를 리셋(0)한다.

JMP CVTEND

ERR1: STC ;에러이면 캐리를 세트(1)한다.

CVTEND: RET

CVTAL ENDP

;  1문자를 띄고 지정된 아스키 코드에 상당하는 문자를 출력하고,

 줄을 바꾸는 서브루틴

PUTASC  PROC

MOV DH,DL

MOV DL,' '

MOV AH,2

INT 21H

MOV DL,DH

MOV AH,2

INT 21H

MOV DL,CR

MOV AH,2

INT 21H

MOV DL,LF

MOV AH,2

INT 21H

RET

PUTASC  ENDP


CODE  ENDS

END






프로시듀어의 배치


 PROC -- ENDP 의사명령은 사람이 보기 편하기 위한 구분에 불과합니다.

즉,어셈블러는 실제로 프로시듀어를 구별하지 못합니다.

예를 들면 다음의 2(INT 21H)를 3 으로 옮긴후 컴파일 하면 에러가

나오지 않으나 프로그램을 실행하게 된다면  1번을 실행한 후 끝 맺지

못하고 4 로 계속 실행하므로 프로그램이 폭주하게 됩니다.


CODE  SEGMENT

ASSUME CS:CODE

EOF EQU 1AH

START:  CALL GETCH

JC EXITP

MOV DL,AL

CALL PUTCH

JMP START

EXITP:  MOV AH,4CH  -----1

INT 21H -----2

GETCH PROC  -----4

MOV AH,8

INT 21H

CMP AL,EOF

JNE GETCHEND

STC

RET

GETCHEND:

CLC

RET

GETCH ENDP

PUTCH PROC

MOV AH,2

INT 21H

RET

PUTCH ENDP

---------3-----------

CODE  ENDS

END START  ;여기에서는

시작번지를 지정해 주지 않아도 됩니다.






 END 문장 다음에 START 라는 이름이 쓰여진 이유는 프로그램의 시작번지를

지정했기 때문입니다. 지정하지 않는 다면 컴파일러는 프로그램의 시작부터

실행하라는 뜻으로 해석합니다.

 그러나,여러개의 코드세그먼트를 가진 프로그램을 작성하는 경우와

프로시듀어와 메인 루틴의 순서를 바꾼 프로그램을 작성하는 경우에는

꼭 지정해 줘야합니다.


 다음은 그 예로 앞 프로그램의 프로시듀어와 메인루틴의

 순서를 바꾼 것입니다.


CODE  SEGMENT

ASSUME CS:CODE

EOF EQU 1AH

GETCH PROC

MOV AH,8

INT 21H

CMP AL,EOF

JNE GETCHEND

STC

RET

GETCHEND:

CLC

RET

GETCH ENDP

PUTCH PROC

MOV AH,2

INT 21H

RET

PUTCH ENDP

;메인루틴의 시작

START:  CALL GETCH

JC EXITP

MOV DL,AL

CALL PUTCH

JMP START

EXITP:  MOV AH,4CH

INT 21H  

CODE  ENDS

END START ;시작번지

지정



ID:
PW:

     0 분
     2 분

자유게시판

건강백과 HOME

홈페이지 HOME

조   약     HOME

생활지혜 HOME

서식양식 HOME

법원 전산양식 검색

In Na zum

비공개 HOME

백과넷 포탈 : 건강/법률(메인)/홈피/서식/조약/생활지혜

◁ 2002.9.1.~2021.4.11. ▷

관리자 연락(저작권 의심 신고) : 김병희 010-6204-4973 k8z7@hanmail.net