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

홈페이지HOME

PHP

JavaScript

HTML

CSS

드롭다운메뉴

제로보드4

도   움   말

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

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

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

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

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

관주성경 TTS 일반파일 TTS

바이블로 Bible_ro 다운로드

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

[도움말 보기] 바로가기

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

asm_10.

(프로시저와 스택)



프로그래밍 언어도 하나의 언어입니다.

언어란 하나의 약속입니다.

우리가 약속을 모를 때 우리는 전혀 무능한 사람입니다.

그러나 일단 약속을 알고 나면 우리는 유능한 사람이 됩니다.

우리는 외국 사람들과 대화하기 위하여, 그 외국 사람들 사이의 약속인 해당 외국어를

열심히 배웁니다.

프로그래밍 언어를 배우는 것은 확실히 그보다 쉽습니다.






제 10 장  프로시저와 스택

이제 우리는 디버그에 대해서 기본적인 지식을 꽤 많이 알게 되었다.

그러나, 프로그램다운 프로그램을 만들기 위해서는 프로시저와 스택에 관한 이해를

빼 놓을 수 없을 것이다.


제 1 절  프로시저

프로시저(procedure)는 명령어의 집합(집단)이다.

베이직에서는 명령어 집합을 서브루틴(subroutine)이라고 한다.

프로시저 즉 명령어 집합을 만들어 두는 이유는 무엇인가?

먼저 프로시저를 호출하여 실행하는 구조를 그림으로 그려 보자.


+-------------------------+ +-------------------------+

    | 주 프로시저 |

     +---------->

    | <번지 1> 프로시저 |

+-------------------------+  ||-------------------------+

    | - call <번지 1> <Enter> | -----------------+  | -

    ......... <Enter> |

+-------------------------+ |-------------------------+

    | - ............. <Enter> | <---------------------------- | -

    ret <Enter> |

+-------------------------+ +-------------------------+

    | - call <번지 2> <Enter> | ---------+

+-------------------------+  |

     +-------------------------+

    | - ............. <Enter> | <---++------------------>

    | <번지 2> 프로시저 |

+-------------------------+ | |-------------------------+

    | | -

    ......... <Enter> |

    | |-------------------------+

    +------------------------

    | - ret <Enter> |

    +-------------------------+







                        위의 그림을 보면 call 명령이 지정된 번지의 프로시저를 호출하고 그 프로시저의

실행이 끝난 후에는 ret 명령으로 call 다음 명령줄로 복귀함을 알 수 있다.

그런 방식으로 몇 개의 프로시저라도 호출 실행할 수 있는 것이다.

우리는 16진수 1 자리를 입출력하는 프로그램에 연속적으로 나왔던 몇 개의 명령어들이

16진수 2 자리의 입출력 프로그램에도 비슷하게 사용되는 것을 보았다.

그와 같이 프로그램 내에서 같은 모양으로 연속되는 명령어 집합을 따로 만들어

두면 필요한 자리에서 호출 실행하는 것으로 간단히 처리할 수 있을 것이다.

프로시저의 필요성은 바로 거기에 있는 것이다.

나중에 어셈블리로 프로그램을 작성하다 보면 알겠지만, 사실 어셈블리 프로그램은

프로시저로 시작하여 프로시저로 끝난다.

C 언어의 프로그램이 함수로 시작하여 함수로 끝나는 것과 마찬가지이다.

다만 어떤 프로그램이든지 주 함수가 있어, 그 프로그램의 시작과 끝은 주 함수에

들어 있게 마련이다.

그와 같이 독립된 여러 개의 함수를 만들어 두고 주 함수에서 다른 함수를 호출하여

실행하도록 만들면 구조적이면서도 수정이 용이한 프로그램이 된다.

어셈블리에서도 마찬가지로 독립된 여러 개의 프로시저로 프로그램을 짜되 다만

주 프로시저가 있어 프로그램은 주 프로시저에서 시작되고 끝나는 것이다.

프로시저에 대한 실습은 조금 뒤로 미루기로 한다.






제 2 절  스택과 복귀 주소

우리는 방금 말하기를 call 명령으로 호출된 프로시저의 실행이 끝난 후 그 프로시저의

마지막 명령 ret로 프로그램의 제어는 call 명령 바로 다음 줄에 있는 명령어로 복귀된다고

쉽게 말하였다.

그러나, 곰곰히 생각해 보면 8088은 어떻게 하여 프로시저가 끝난 뒤에 돌아가야

할 복귀 주소를 알아 내는 것일까?


1.  스택과 LIFO

여기에서 우리는 프로시저를 호출 실행한 후에 8088이 찾아 돌아갈 복귀 주소를

어딘가에 기억시켜 둘 필요가 있다는 생각을 하게 된다.

그 기억 장소로 제공되는 것이 바로 스택이다.

call <번지> 명령은 3 바이트를 차지한다.

따라서 call 명령이 시작된 번지에 3을 더하면 복귀할 번지를 계산할 수 있다.

아무튼 그 계산은 8088이 알아서 할 것이다.

그러면 계산된 복귀 주소를 스택이라는 장소(메모리 영역)에 어떻게 저장할까?

그 저장하는 모양을 흔히 접시 쌓기에 비유한다.

여러 개의 접시를 겹쳐서 쌓아 두면, 꺼낼 때는 가장 나중에 얹었던 접시를 가장

먼저 꺼내 쓰기가 쉽다.

은행이나 창고의 금전 관리, 물류 관리로 말하자면 후입선출법이 적용된다.

영어로는 lifo(last in first out) 구조라고 한다.






2.  LIFO가 적용되는 경우

후입선출 구조가 실제로 사용되는 경우는 어떤 때일까?

흔히 프로그래밍을 배웠다고 하면서 용어는 많이 알고 있는 듯한데, 막상 어디에

소용되는 것인지를 물어 보면 모르는 경우에 그 지식이 무슨 의미가 있을까?

가령 위에서 보인 그림과 같이 주 프로시저에서 하나의 프로시저를 호출하여 실행하고,

호출된 프로시저는 다른 프로시저를 호출함이 없이 실행을 마치고 주 프로시저로

복귀한다면 LIFO가 적용될 필요성이 없다.

그 경우는 접시 쌓기에 비유한다면 하나의 접시만 엎어 두었다가 다시 다른 접시를

겹쳐 엎지 않은 상태에서 접시를 꺼내 쓰는 것과 같기 때문이다.

LIFO가 위력을 발휘하는 경우라면, 주 프로시저에서 프로시저 1을 호출하여 실행하였는데

프로시저 1의 실행 과정에서 다시 프로시저 2를 호출하고 그것이 실행되다가 다시

프로시저 3을 호출하는 식으로 여러 계층의 호출이 이루어질 때이다.

가령 100h에서 시작된 주 프로시저가 110h에서 call 명령으로 200h에서 시작되는

프로시저 1을 호출하였다면 최초의 복귀 주소 113h가 스택에 저장될 것이다.

그리하여 호출된 프로시저 1이 220h에서 call 명령으로 300h에서 시작되는 프로시저

2를 호출하였다면 두 번째 복귀 주소 223h가 스택에 저장될 것이다.

또한 호출된 프로시저 2가 330h에서 call 명령으로 400h에서 시작되는 프로시저

3을 호출하였다면 세 번째 복귀 주소 333h가 스택에 저장될 것이다.

나아가 호출된 프로시저 3이 440h에서 call 명령으로 500h에서 시작되는 프로시저

4를 호출하였다면 네 번째 복귀 주소 443h가 스택에 저장될 것이다.

이와 같이 스택에 싸여 있는 복귀 주소를 그림으로 그려 보자.


    복귀 주소를 스택에 저장한 순서 ->

     ->  ->

    0113

     0223  0333  0443

    스택에서 복구 주소를 꺼내는 순서 <-

     <-  <-


그림과 같이 프로시저 4가 더이상 다른 프로시저를 호출함이 없이 끝나면, 마지막에

저장된 복귀 주소 0443h를 꺼내어 프로시저 3으로 복귀할 것이다.

마찬가지로 프로시저 3이 끝나면 0333h를 찾아 프로시저 2로 복귀한다.

마찬가지로 프로시저 2가 끝나면 0223h를 찾아 프로시저 1로 복귀한다.

마지막으로 프로시저 1도 끝나면 0113h를 찾아 주 프로시저로 복귀할 것이다.






3.  스택과 레지스터

그렇다면, 8088 내부에 스택을 관리하는 무엇인가가 있어야 될 것이다.

8088의 13 개 레지스터 중에서 스택을 관리하는 것은 SS(stack segment) 레지스터와

SP(stack pointer) 레지스터이다.



ID:
PW:

     0 분
     4 분

자유게시판

건강백과 HOME

홈페이지 HOME

조   약     HOME

생활지혜 HOME

서식양식 HOME

법원 전산양식 검색

In Na zum

비공개 HOME

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

◁ 2002.9.1.~2021.4.11. ▷

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