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

홈페이지HOME

PHP

JavaScript

HTML

CSS

드롭다운메뉴

제로보드4

도   움   말

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

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

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

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

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

관주성경 TTS 일반파일 TTS

바이블로 Bible_ro 다운로드

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

[도움말 보기] 바로가기

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


asm_73.


제 4 절  번지의 간접지정 방식


     12 이형문 buju8t 12/18 1253

     9 번지의간접지정방식에 대해 알아봅시다


이 장에서는 번지의 간접지정방식에 대해 알아 보기로 한다.

간접지정방식이란, 변수의 값을 레지스터에 대입(전송)하는 것이 아니라 변수가

데이타로서 놓여 있는 번지수를 레지스터에 전송하는 방법을 말한다.

변수의 값을 지정할 때와 달리 변수의 번지를 지정할 때는 [ ]로 묶어 준다.

먼저, 간접 번지 지정방식으로 메모리에 저장된 ABC를 화면에 표시하는 프프로그램

소스를 전체적으로 보고 자세한 내용을 공부하기로 하자.


     ## 필자통신

    이 장에서 설명하는 내용은 분량이 다소 적다. 그러나, 양에 비해서 설명하는

    내용은 대단히 중요한 것이며 처음 배우는 입장에서는 그리 쉬운 내용이 결코

    아니므로 이 정도만으로도 한 강좌의 가치가 있다.







1. 프로그램 소스

지금까지 충분히 설명을 들어서 잘 알고 있겠지만, 이 프로그램에서는 main이라는

하나의 세그먼트로 CS와 DS를 모두 정의해 주고 있다.


     1. MAIN  SEGMENT

     2. ASSUME CS:MAIN,DS:MAIN

     3. MOV AX,CS

     4. MOV DS,AX

     5. MOV BX,OFFSET

    XXX

     6. MOV DL,[BX]

     7. MOV AH,2

     8. INT 21H

     9. MOV DL,[BX+1]

    10. MOV AH,2

    11. INT 21H

    12. MOV DL,[BX+2]

    13. MOV AH,2

    14. INT 21H

    15. MOV AH,4CH

    16. INT 21H

    17. ;

    18. XXX DB 'ABC' 기계어

    코드 :001F  41 42 43

    19. ;

    20. MAIN  ENDS  

    21. END


이 소스의 1줄부터 4줄까지는 익숙한 내용인데, 5줄 이하의 모양이 이상하다.

5줄에서는 처음 보는 offset 명령이 보이고, 6, 9, 12줄에는 [BX+?]와 같은 형식으로

[ ]로 둘러싸인 전송할 내용이 나타나 있다. 또한 18줄에서는 바이트 데이터(DB)를

저장하는 변수 XXX에 'ABC'라는 것이 지정되어 하나의 문자가 아니라 무려 3개의

문자(3바이트)를 저장해 둔 이상한 모양이 보인다.

결국, 이 프로그램에서 우리가 새로 알아야 될 것은 전부 3가지이다.


    offset

    [BX+?]

    DB 'ABC'


그 외에는 이미 우리가 다 배워서 알고 있는 것이다.


     ## 활용 팁

    이렇게 프로그램을 분석해 보면, 실제로 우리가 새삼스럽게 힘들여 배워야

    될 부분은 얼마 되지 않는 것이다. 그런 식으로 공부할 문제의 범위를 정확하게

    파악하고 시작하면 휠씬 가벼워진다.







2. OFFSET 의사명령

우리가 이 프로그램에서 생소하게 느끼는 첫 내용은 5줄의 offset이었다.


     5. MOV BX,OFFSET

    XXX


만약 그 줄이 우리가 지금까지 보았던 것처럼 다음과 같다면 어떻게 될까?


    MOV DL,XXX


당연히 변수 xxx에 저장된 한 문자를 출력하고 프로그램이 끝날 것이다.

18줄 오른쪽에 번역된 기계어 코드를 참조하면 XXX라는 변수에 41H라고 하는 수치가

대입되어 있다고 생각해도 크게 차이는 없을 것 같지만, 그렇게 생각한다면 다음에

저장되어 있는 42H, 43H라고 하는 데이터를 꺼내 쓸 수가 없다.

그러나 우리는 변수 xxx의 크기를 3바이트로 만들어 그 안에 ABC라는 3개의 문자를

차례로 저장해 두었고, 그것을 차례로 꺼내어 출력할 필요가 있다.

이런 경우에는 변수의 시작 번지로부터 차례로 1바이트씩을 꺼내어 연속 전송하는

방법이 있어야 될 것이다. 그 일을 해 주는 것이 offset 의사명령이다.

8086에서는 명령이나 데이터의 번지는 모두 그것이 저장되어 있는 세그먼트로

부터 몇 바이트 째에 있는가에 의해 표시된다. 이와 같이 특정 세그먼트를 기준으로

구체적인 데이터의 위치를 지정하는 번지를 오프셋 번지라고 한다.

따라서 OFFSET 의사명령은 오른쪽에 있는 변수 이름 등의 번지를 꺼내어 왼쪽의

레지스터 등으로 전송하는 역할을 하는 것이다. 즉, 데이터가 저장되어 있는 장소의

오프셋 번지를 꺼내는 의사명령이 된다.






그러면 다음과 같이 해 주면 어떻게 될까?


    MOV DL,OFFSET XXX


이 명령은 잘못 된 것이다. 변수 xxx의 데이터 크기는 바이트(DB)이지만 그 변수의

오프셋 번지는 16진수 4자리 즉 워드 크기이기 때문에 위의 명령은 워드 크기의 데이터를

바이트 크기의 레지스터 DL로 전송하라는 뜻이 되어 잘못이다.

따라서 우리는 워드 크기의 변수 오프셋 번지를 워드 크기의 다른 레지스터에

일단 전송한 다음에 그 레지스터를 이용하여 어떻게 해 보지 않으면 안 된다.

그래서 다음과 같이 일단 변수 번지를 BX 레지스터에 전송해 두는 것이다.


     5. MOV BX,OFFSET

    XXX


이 명령은 데이터가 저장되어 있는 변수 XXX의 시작 번지의 값을 BX 레지스터로

전송하라는 명령으로, 이 프로그램에서는 001FH가 BX에 저장된다.

따라서, 뒤에 자세한 설명을 하겠지만 [BX]를 지정하면 오프셋 001FH에 저장되어

있던 데이터(코드값 41H)가 전송되고 [BX+1]을 지정하면 오프셋 0020H 번지에 저장된

데이터, [BX+2]를 지정하면 그 다음 데이터가 차례로 전송된다.

이상으로 offset 의사명령의 용도와, 그 번지를 바로 DL 레지스터에 전송하지

않고 BX 레지스터로 전송하는 이유를 이해하게 되었을 것이다.






3. 간접번지지정

이제 BX 레지스터를 사용하여 XXX라고 하는 변수이름의 장소(오프셋 번지)에 저장되어

있는 데이터를 순서대로 꺼내어 보기로 한다.

8086 명령에서는 OO 번지에 있는 데이터를 DL 레지스터로 전송하라는 명령은


    MOV DL,[OO]


와 같이 표시한다.

이 프로그램 소스에서 변수 정의를 옮겨 두고 계속해 보자.


    18. XXX DB 'ABC' 기계어

    코드 :001F  41 42 43


이 줄에서 소스를 어셈블해 보면 왼쪽의 XXX DB 'ABC' 명령줄에 대응하는 기계어

코드가 오프셋 001F번지로부터 41 42 43과 같이 입력된다는 말이다.

출력할 데이터가 IFH번지로 부터 저장되어 있으므로 다음과 같이 해도 된다.


     MOV  DL,[1FH] ; 1FH번지

    속에 있는 데이터 "A"를 전송하라는 명령


이어서 [20h] [21h]를 차례로 전송해 주면 될 것이다.

그러나 이 프로그램에서는 데이터가 저장된 변수의 오프셋 번지를 직접 지정하여

전송하지 않고, 앞에서 변수 XXX의 시작 번지를 일단 BX 레지스터에 전송해 두었다가

그것을 이용하여 다음과 같이 간접적으로 전송하였다.


    MOV DL,[BX]


이어서 2번째 데이터는 [변수의 시작 번지 + 1] 번지에 저장되어 있으므로 그것을

역시 BX 레지스터 값을 이용하여 다음과 같이 간접적으로 전송하였다.


    MOV DL ,[BX+1]


이와 같이 offset 의사명령으로 데이터가 저장된 시작 번지를 다른 레지스터에

먼저 전송해 두고 그 레지스터의 값을 참조하여 출력할 데이터가 저장되어 있는 오프셋

번지를 DL 레지스터에 전송하는 방법을 간접지정방식이라고 부른다.


    DL -

     [BX+?]- offset

    변수 - 데이터


그러면 굳이 BX 레지스터라는 중간 다리를 이용하여 이와 같이 복잡하게 프로그래밍을

하는 이유와 실익은 과연 어디에 있을까?

조금이라도 수고를 더 할 때는, 투자한 이상의 얻을 것이 있기 때문이다.

우리가 만약 변수의 오프셋 번지를 직접 DL 레지스터로 전송하려면 우리는 프로그래밍을

할 때마다 해당 변수의 오프셋 번지를 일일이 확인해야 될 것이다.

그러나 변수의 오프셋 번지를 일단 BX 레지스터로 저장하고 시작하면, 그 후에는

우리가 오프셋 번지를 확인하거나 기억할 필요도 없이 DL 레지스터에는 언제나 [BX]

[BX+1] [BX+2] ...와 같이 기계적으로 전송해 주면 되므로 간편하다.






4. 변수 DB

이제 마지막으로 변수의 모양을 확인하고 이번 장을 마치기로 한다.


    18. XXX DB 'ABC' 기계어

    코드 :001F  41 42 43


바이트 데이터(DB)에는 원래 1바이트 크기인 문자 하나가 저장되는데, 여기에서는

무려 3개의 문자를 바이트 데이터에 저장하였으니 문제가 없을까?

우리는 앞 장(3.5. 변수의 정의)에서 변수의 데이터 크기에 따라 변수의 형을

지정하는 명령(DEFINE 디렉티브)에는 어떤 것들이 있는지를 알아 보았다.


    DB ---- 바이트 정의

    DW ---- 워드(2바이트) 정의

    DD ---- 더블 워드(4바이트) 정의

    DQ ---- 쿼드 워드(8바이트) 정의

    DT ---- 10바이트 정의


첫 줄의 바이트 데이터는 크기가 1바이트이므로 당연히 그 명령으로 지정되는

변수형(바이트형)에 어울리는 바이트 크기의 데이터 1개가 와야 될 것이다.

그러나 DEFINE 디렉티브 중에서 유독 DB에는 특별한 기능을 부여해 두었다.

이것은 약속에 따라 그렇게 된 것이므로, 무조건 외워야 된다.

DEFINE 디렉티브로 정의되는 데이터는 기본적으로 해당되는 변수형에 맞는 크기의

데이터가 되어야 하지만, 여기에는 몇 가지 예외가 있다.

DB의 경우에는 특별히 3문자 이상의 문자열을 나열하기 위하여 'A','B','C'와

같이 1바이트 단위로 일일이 구분하는 대신 'ABC'라고 약식으로 표기 할 수있도록

허용되어 있다.






따라서 다음 두 줄의 명령은 전혀 동일한 것이며, 어떤 것도 사용이 가능하다.


    XXX  DB 41H,42H,43H

    XXX  DB 'A','B','C'

    XXX  DB 'ABC'


변수형에 해당되는 크기의 데이터라면 쉼표(,)로 구분하여 몇 개의 데이터라도

하나의 줄에 나열할 수가 있는데, 이런 방법은 다른 형의 변수에도 가능하다.


    YYY DW 'AB','CD','EF'

    ZZZ DW 1234H,5678H

    ABC DD 123456H,789ABCH

    XYZ DQ 12H,3456789AH


다만, 수치로써 데이터를 표시하는 경우에는 모든 DEFINE 디렉티브에서 그 방법이

가능하지만, 문자열로써 데이터를 표시하는 경우에는 DW,DD,DQ,DT에서는 한 번에

2문자씩의 문자열 밖에 표시할 수 없다.

따라서 비록 더블 워드 변수의 디렉티브(DD)를 사용한다 하더라도, 수치 데이터를

입력하지 않고 문자 데이터를 입력할 때는 더블 워드 단위로 입력해서는 안 되며

반드시 워드 단위로 잘라 입력해 주어야 된다.


    AAA DD 'AB','CD','EF', 'GH' * 올바른 표현

    *

    AAA DD 'ABCD','EFGH'*

    잘못 된 표현 *


이 장에서는 OFFSET 의사명령과 간접번지지정방식에 관해 프로그램을 만들어서

살펴 보았고, 또 변수형을 정의하는 디렉티브의 사용법에 관해서도 복습을 겸하여

좀 더 깊이 알아 보았다.

이 장의 프로그램에서는 데이터를 MAIN이라는 이름의 코드 세그먼트 내에 두었는데,

다음 장에 가서는 앞 장까지 배운 내용을 이용하여 데이터를 별도의 데이터 세그먼트에

두는 프로그램을 짜 보기로 한다.



ID:
PW:

     0 분
     1 분

자유게시판

건강백과 HOME

홈페이지 HOME

조   약     HOME

생활지혜 HOME

서식양식 HOME

법원 전산양식 검색

In Na zum

비공개 HOME

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

◁ 2002.9.1.~2018.8.16. ▷

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