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

홈페이지HOME

PHP

JavaScript

HTML

CSS

드롭다운메뉴

제로보드4

도   움   말

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

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

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

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

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

관주성경 TTS 일반파일 TTS

바이블로 Bible_ro 다운로드

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

[도움말 보기] 바로가기

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

이 글은 1994. 8.월초(?)경부터 하이텔에 올렸던 자료이다.

하이텔에 들어가 보니 일부 없어진 것이 있는데, 다행히 내 컴퓨터에서 찾았다.

asm_02. (메모리 편집)

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

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

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

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

우리는 외국 사람들과 대화하기 위하여, 그 외국 사람들 사이의 약속인 해당 외국어를 열심히 배웁니다.

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

필자도 프로그래밍 전문가가 결코 아니며, 오히려 입문하는 중입니다.

필자가 감히 글을 쓰는 것을 보고, 부담 없이 따라 오시기 바랍니다.

디버그는 프로그램밍 언어 패키지를 구입하지 않아도, 도스만 있으면 누구나 사용할 수 있는 도구입니다.

우선 디버그(디버거, 도스의 debug.exe)로 시작합시다.

제 02 장  메모리 편집

우리가 프로그램을 만들 때는 레지스터를 사용하지만, 프로그램 자체는 메모리에 만드는 것이며, 완성되면 디스크에 저장해야 나중에 사용할 수 있게 된다.

따라서 우리는 메모리를 어떻게 편집하느냐 하는 방법을 알아야 될 것이다.

메모리 편집은 입력(enter)을 뜻하는 e 명령으로 한다.

제 00 절  복습(제 01 장)

디버그의 명령은 대개 레지스터라는 것을 중심으로 이루어진다. 레지스터의 내용을 확인하려면 r 명령으로 가능하다.

레지스터 명령 곧 r로 보이는 화면에서 사용자의 시스템에 따라 다르게 나타날 수 있는 부분은 일부 레지터의 4 자리 16진수 값일 뿐이다.

레지스터 보고서 첫줄에서는 SP 레지스터만이 0000이 아닌 값을 보여 준다.

보고서 둘째 줄에서 DS, ES, SS, CS라는 4 개의 레지스터는 같은 값으로 나타나며, 그와 달리 IP 레지스터는 처음에는 언제나 0100으로 보인다.

보고서 셋째 줄의 처음에 나오는 4 자리 16진수는 둘째 줄의 4 개 레지스터 값과 같은 값으로 보이지만, 사실은 CS 레지스터의 값을 표시한다.

셋째 줄의 콜론(:) 뒤에 나오는 4 자리 16진수는 0100이 된다.

따라서 셋째 줄에 보이는 콜론(:) 좌우의 4 자리 16진수는 을 나타낸다는 사실을 알 수 있다.

CS:IP는 현재의 메모리 번지를 나타내는 것이다.

CS:IP 메모리 번지 뒤에 처음 나오는 16진수의 쌍은 그 메모리 번지에 저장되어 있는 16진수 값을 표시하는 것이다.

그 뒤에 나오는 16진수 2 쌍은 그 값을 우리가 알아 볼 수 있는 어셈블리어로 번역한 명령어이다.

레지스터 이름이나 명령어에는 영문자 o가 들어갈 수 있지만, 수를 나타내는 16진수 값에는 영문자 o가 들어갈 수 없다.

16진수의 각 자리를 구성하는 숫자 16 개는 (1, 2, 3, 4, 5, 6, 7, 8, 9, a(10), b(11), c(12), d(13), e(14), f(15))이다.

10진수 16은 16진수로 10h와 같이 표시하여 10진수와 구분한다.

그러나 h라는 것은 우리가 구별하기 쉽도록 사용하는 것일 뿐, 디버그를 실행하여 보이는 화면에는 나타나지 않는다.

뿐만 아니라 우리가 디버그에서 입력할 때도 h를 분여서는 안 된다.

레지스터란 고급 언어의 변수와 비슷하여, 어떤 값을 담아 둘 수 있다.

변수가 그러하듯이, 레지스터에도 새로운 값을 담으면 이전 값은 사라진다.

레지스터에 담아 두는 값은 어떤 명령어를 뜻할 수도 있고, 어떤 명령을 실행하는 데 있어서 실행 대상이 되는 파라미터를 뜻할 수도 있다.

그러나 변수와 달리, 레지스터는 메모리의 일부가 아니다.

범용 레지스터는 AX, BX, CX, DX의 4 개가 있다.

16진수 4 자리 크기의 수를 워드라고 부른다.

우리가 디버그를 실행하여 프로그램을 만들 때, 한 편으로는 레지스터를 사용하고 다른 한 편으로는 메모리를 이용하여 프로그램을 짜게 된다.

8088, 80286 등 80x86으로 표시하는 소위 8088 계열의 컴퓨터 프로세서에서 기본적으로 표시할 수 있는 최대값은 16진수 4 자리인 워드이다.

따라서 16진수로 0에서 FFFF까지 표시할 수 있으며, 이것을 10진수로 환산하면 0에서 65535까지 65536 개의 수를 표시할 수 있다는 결론이다.

컴퓨터에서 킬로란 1000 배가 아니고 1024 배를 나타낸다.

따라서 메가란 1000000 배가 아니고 1024 X 1024 배를 나타낸다.

8088은 메모리를 세그먼트라고 하는 단위로 분할하여 사용한다.

세그먼트 하나의 크기는 64 KB 즉 65536 바이트 크기가 된다.

세그먼트의 레이블(이름)을 표시하는 레지스터가 CS 레지스터이다.

하나의 CS 레지스터 메모리 구역 내에서 특정 메모리의 상대적인 주소를 표시하는 것이 바로 IP 레지스터라는 것이다.

IP 레지스터가 표시하는 메모리 번지를 오프셋이라고 한다.

결국 메모리의 번지는 <세그먼트 번지:오프셋 번지>의 쌍으로 표시된다.

디버그의 보고서 셋째 줄 첫 부분에 나오는 것이 메모리 번지이다.

제 01 절  레지스터 정리

메모리 편집에 들어가기 전에 레지스터에 관해 체계적으로 재정리하자.

아울러 약간 더 알아 보고 넘어가자.

1.  레지스터에 관한 메모

    (1) 레지스터는 메모리의 일부가 아니다.

    (2) 레지스터는 변수와 같은 기능을 한다.

    (3) 따라서 우리는 레지스터에 어떤 값을 저장하고 변경할 수 있다.

    (4) 레지스터에 저장된 값은 어떤 명령, 또는 어떤 명령의 대상을 표시한다.

    (5) 레지스터의 값을 보기 위해서는 r 명령을 사용한다.

    (6) 레지스터의 수는 얼마 되지 않는다.

    (7) 13 개의 레지스터는 모두 하나의 워드(2 바이트, 16 비트) 길이를 가진다.

    (8) AX, BX, CX, DX를 범용 레지스터라고 한다.

2.  레지스터 값을 변경하기

앞에서 우리는 r 명령으로 모든 레지스터의 상태를 볼 수 있었다.

어떤 특정 레지스터의 상태를 보고 그 값을 변경하기 위해서는 어떻게 할까?

     - r ax

     ax 0000

     :

r <레지스터 이름> 명령을 하면 된다.

그러면, 그 레지스터에 저장된 값을 보여 주면서 바꿀 값을 입력하라고 한다.

1 자리 내지 4 자리의 16진수를 입력하고 하면 그 값으로 바뀐다.

입력할 때는 16진수임을 표시하는 h를 덧붙여서는 안 된다.

     : 9

     - r ax

     ax 0009

     :

만약 9를 입력하고, 다시 r ax 명령을 하면 위와 같이 보일 것이다.

우리가 몇 자리의 수를 입력하든 디버그는 앞에 0을 붙여서 4 자리로 표시한다.

값을 변경하고 싶지 않으면 그냥 만 치면 된다.

제 02 절  메모리 편집 입문

레지스터 값을 변경하기 위해서는 r 명령을 쓰면 되었다.

그러나, 메모리의 값을 편집(입력)하기 위해서는 e 명령을 사용한다.

1.  입력(enter)

우리가 만드는 프로그램의 내용은 일단 메모리에 저장(기록)한다.

메모리에 어떤 값을 저장하거나 변경할 때는 e 명령을 사용한다.

입력을 뜻하는 enter의 첫 글자를 딴 명령이다.

우선 다음과 같이 명령을 해 보자.

     - e 100

     0BDB:0100 0F.

그러니까, 0BDB:0100 번지에는 0F라는 값이 저장되어 있다는 사실을 알려 주면서 값을 변경하고 싶으면 다른 값을 입력하라고 점(.)으로 구분하여 보여 준다.

1 자리 내지 2 자리의 16진수를 입력하고 하면 그 값으로 바뀐다.

입력할 때는 16진수임을 표시하는 h를 덧붙여서는 안 된다.

     0BDB:0100 0F. 9

     - e 100

     0BDB:0100 09.

만약 9를 입력하고, 다시 e 100 명령을 하면 위와 같이 보일 것이다.

우리가 몇 자리의 수를 입력하든 디버그는 앞에 0을 붙여서 2 자리로 표시한다.

값을 변경하고 싶지 않으면 그냥 만 치면 된다.

이 간단한 예제에서 우리는 몇 가지 궁금한 문제를 발견하게 된다.

2.  오프셋 100 번지의 비밀

먼저 생각되는 문제는, 위 명령 뒤에 온 100에 관한 궁금증이다.

그것은 우리가 어떤 내용을 입력하는 메모리의 오프셋 번지를 표시한다.

앞서 메모리 번지는 세그먼트와 오프셋을 조합하여 표시한다고 배웠다.

또한 우리는 세그먼트 주소에는 신경쓸 일 없이, 오프셋 주소를 주로 다루게 된다는 사실도 이미 말한 바 있다.

그것은 그렇다 하고 0에서 FFFF(10진수 65535)까지의 오프셋 번지 중에서, 우리는 왜 하필이면 100 번지를 대상으로 편집하는가?

디버그는 그것이 처음 실행될 때마다 IP 레지스터에 저장되어 있는 오프셋 주소를 100h 번지로 설정한다.  앞에서 r 명령으로 살펴본 것과 같다.

지금이라도 다시 debug 명령을 하고, 이어 r 명령을 사용해 보라.

이 사실을 기억해 두면 매우 편리한 점이 있다.

우리가 편집하는 명령의 시작 주소를 100h로 선택하게 되면, 그 명령을 아무 주소에나 입력해 두었다가 나중에 실행하기 위하여 그 주소를 기억하고 IP 레지스터의 값을 그에 맞게 설정해 주는 번거로운 작업을 생략할 수 있기 때문이다.

이 100h의 편리함은, 뒤에 가서 g 명령에서 다시 확인하게 될 것이다.

왜 디버그는 처음 실행될 때마다 항상 0에서 FF까지 오프셋 번지를 건너 뛰어 100h 번지를 IP 레지스터에 저장된 값으로 제시하는가?

세그먼트 내에서 처음의 256(100h) 바이트(즉 0 내지 FF 번지)는 초보적인 프로그래머들이 관심을 가지고 살펴 볼 필요가 없는 여러 가룔를 저장하기 때문이다.

3.  워드와 바이트

메모리 편집에서 또 하나 생각되는 점은 16진수 2 자리를 다룬다는 것이다.

이 점은 레지스터 값이 16진수 4 자리였던 사실과 비교된다.

레지스터에 저장될 수 있는 값은 16잰수 4 자리 즉 워드 크기이다.

메모리의 각 오프셋 번지에 저장되는 값은 16진수 2 자리 즉 바이트 크기이다.

왜 어떤 것은 워드라고 하고 다른 어떤 것은 바이트라고 하는가?

그 질문은 왜 어떤 것은 미터라고 하고 다른 어떤 것은 센티미터라고 하는가 하고 묻는 것처럼 참으로 답답한 질문이 되고 말 것이다.

그렇게 정해 두었으므로, 우리는 그런 것으로 알고 써야 된다.

우리는 단지 16진수 2 자리 크기를 바이트라 하고, 그 배가 되는 16진수 4 자리 즉 2 바이트 크기를 워드라고 한다고 외우고 그렇게 부르면 그만이다.

4.  바이트와 비트

앞서 우리는, 컴퓨터가 직접 알아 보는 수치가 2진수라는 사실을 알았다.

그리고, 2진수의 1 자리를 비트라고 한다.

16진수 1 자리는 2진수 4 자리와 동일한 크기이다.

이것은 두 가지 진법에 따른 수를 10진수와 비교하여 보면 분명해진다.

먼저 2진수 4 자리 중 가장 큰 수 1111을 10진수 및 16진수로 환산해 보자.

2진수는 binary의 첫글자를 따서 b를 붙여 표시한다.

    1111b = 15 (1 * 8 + 1 * 4 + 1 * 2 + 1 * 1) = Fh

위의 계산으로 우리는 2진수 4 자리가 16진수 1 자리 크기라는 사실을 알았다.

따라서, 16진수 2 자리 크기인 1 바이트는 8 비트에 해당됨을 알 수 있다.

5.  16 비트 컴퓨터

나아가 8088 계열(8088, 80286, 80386)의 레지스터가 저장할 수 있는 16진수 4 자리 크기인 워드(2 바이트)는 16 비트 길이에 해당된다.

긴 설명을 생략하고, 지금까지 배운 것을 그림으로 정리하면 보기 쉬을 것이다.

    비트  15 14 13 12       11 10  9  8      7  6  5  4      3  2  1  0

    2진수  X  X  X  X        X  X  X  X      X  X  X  X      X  X  X  X

    16진수   Y                Y                Y                Y

             |                |                |                |

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

    메모리=오프셋   ( 바이트 )                      ( 바이트 )

                       |                                 |

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

      레지스터                      ( 워드 )

r 명령으로 본 각 레지스터에 저장된 값은 4 자리의 16진수였다.

우리는 8088에 존재하는 13 개의 레지스터가 모두 4 자리의 16진수 즉 하나의 워드 곧 16 비트 길이를 가진다는 사실을 알 수 있는 것이다.

바로 이것이 8088 마이크로 프로세서를 장착한 컴퓨터가 16 비트 컴퓨터로 불리우는 한 가지 이유가 된다.

6.  연속 입력

앞서 우리는 e 100 명령으로 오프셋 100h 번지 메모리를 편집해 보았다.

그 방법으로 오프셋 101h 번지 메모리를 편집하려면 어떻게 할까?

물론, e 101 명령을 사용하면 되는 것은 당연하다.

그러나, 메모리 연속 입력 방법을 알고 보면, 그와 같이 연속된 메모리를 편집할 때는 일일이 e 명령을 따로 하지 않아도 된다.

100h 번지의 기존 값을 보고 새 값을 입력한 후 대신 SP(스페이스바)를 누르면 디버그는 101h 번지의 값을 보여 주며 역시 새 값을 받아 들일 준비를 한다.

ID:
PW:

     0 분
     0 분

자유게시판

건강백과 HOME

홈페이지 HOME

조   약     HOME

생활지혜 HOME

서식양식 HOME

법원 전산양식 검색

In Na zum

비공개 HOME

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

◁ 2002.9.1.~2019.11.15. ▷

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