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

홈페이지HOME

PHP

JavaScript

HTML

CSS

드롭다운메뉴

제로보드4

도   움   말

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

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

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

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

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

관주성경 TTS 일반파일 TTS

바이블로 Bible_ro 다운로드

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

[도움말 보기] 바로가기

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

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

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

asm_00.

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

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

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

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

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

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

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

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

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

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

제 00 장 디버그 입문

디버그란 도스의 debug.exe 파일 이름을 따서 부르는 말이다.

버그(bug)란 컴퓨터 프로그램에서 잘못된 내용이나 실수를 의미한다.

## 버그가 있다는 증명은 가능하나, 없다는 증명은 믿을 수 없다.##

프로그램의 결함을 찾기 위해, 프로그램을 한꺼번에 실행하는 대신, 한 번에 하나의 명령어씩 실행하여 프로그램의 동작 상태를 낱낱이 관찰하여 실수를 발견하고 정정하는 작업을 디버깅(debugging)이라고 한다.

디버깅 작업에 사용되는 도구가 도스의 debug.exe 프로그램이다.

도스 버전에 따라서는 debug.com이라는 이름이 될 수도 있다.

제 00 절 저급 언어를 배우는 이유

프로그래밍 언어는 흔히 저급 언어와 고급 언어로 나눈다.

저급 언어로부터 고급 언어까지 대충 나열해 보면 이렇게 될 것이다.

기계어 ==> 어셈블리 ==> C, 파스칼 등 ==> 제 4 세대 언어

기계어와 같은 저급 언어일수록 배우기 어렵고, 고급 언어일수록 쉽다.

그럼에도 불구하고 왜 어려운 공부를 해야 되는가?

1. 어셈블리어를 배우는 이유

어셈블리어는 C 등의 고급 언어보다는 배우기가 어렵다.

그러나 많은 장점이 있다.

    (1) IBM PC(호환기종)의 기계적인 부분에 쉽게 접근, 이해할 수 있다.

    (2) 8088 계열의 마이크로 프로세서(8088, 80286, 80386 등)에 대해서 이해한다.

    (3) 다른 프로그램, 고급 언어를 더욱 깊이 이해할 수 있다.

    (4) 같은 용도로, 크기가 작은 프로그램을 만들 수 있다.

    (5) 같은 용도로, 실행 속도가 빠른 프로그램을 만들 수 있다.

어셈블리 언어는 기본적으로 프로그래머가 컴퓨터의 기능을 최대한 활용할 수 있도록 만들어 준다고 하겠다.

2. 디버그를 배우는 이유

우리는 디버그를 이용하여 기계어를 약간 공부하게 될 것이다.

이 공부는 컴퓨터의 기계적인 작동에 대한 이해를 도와 준다.

그 이해는 앞으로 어셈블리를 배우고, 또 어셈블리로 프로그램을 짤 때 결정적인 도움을 주게 될 것이다.

곧장 실습으로 들어가기로 하자.

제 01 절 디버그 시작과 끝

무슨 일이든지 시작하려면 어떻게 하는지, 끝내려면 어떻게 하는지가 중요하다.

물론, 일을 시작하려면 어떤 준비물이 있어야 되는지도 알아야 된다.

디버그는 도스(PC-DOS 또는 MS-DOS) 버전 2.00 이상에 플로피 디스크 드라이브 하나 또는 하드 디스크 드라이브가 있으면 족하다.

1. 디버그 준비

디버그를 사용하려면, 도스의 debug.exe(또는 debug.com) 파일이 있어야 된다.

도스 방(directory, 이하 '방'이라고만 표시함)에 그 파일이 들어 있고, 또 도스방의 경로(c:\dos; 등)가 autoexec.bat 파일의 path에 등록되어 있다면 좋다.

그렇지 않다면 그 파일을 디버거를 실행할 방으로 복사해 두자.

디버그는 플로피 디스켓에서도 실행이 가능하다.

즉 하드 디스크 드라이브가 없어도 된다는 말이다.

예컨대 A 드라이브에서 디버그를 실행하려면 이렇게 준비할 수 있을 것이다.

    a:\> copy c:\dos\debug.exe <Enter>

이 글에서 <Enter> 표시는 엔터(enter) 글쇠를 누르라는 뜻이다.

프롬프트와 명령 사이, 명령과 <Enter> 사이의 공백(space)은 보기 좋게 띄운 것이므로 실제 입력할 때는 힘들게 띄울 필요가 없다.

또한 일반적으로 명령이나 레지스터 이름 등은 영문 대문자나 소문자 중에서 어떤 것을 입력하든 아무 상관이 없다.

2. 디버그 실행

위의 준비가 되었으면, 아래와 같이 명령하면 디버그 프로그램이 실행된다.

    ...> debug <Enter>

프롬프트 ...> 표시는 사용자에 따라서 적당히 조절할 수 있다는 뜻이다.

3. 디버그 프롬프트

디버거를 실행하면, 도스 프롬프트 대신 디버그 프롬프트가 나타난다.

    ...> debug

    -

윗줄은 디버그를 실행한 도스 화면 표시이고, 아랫줄은 디버그 프롬프트이다.

- 표시 오른쪽의 커서 위치에 디버거 명령을 입력하고 <Enter>하면 된다.

4. 디버그 끝내기

디버그를 끝내고 도스로 돌아 가려면 q(uit) 명령을 사용한다.

    ...> debug

    - q <Enter>

    ...>

제 02 절 디버그 맛보기 실습

그야말로 맛보기만 하고 넘어가자.

어셈블리를 공부한다는 것이 결코 쉬운 일이 아니기 때문에, 체계적으로 설명하는 데 치중하기보다는 흥미를 잃지 않도록 수시로 배려할 생각이다.

    ## 필자통신

실제로 해 보면 별 어려울 것도 없다.

그러나, 아직 기초가 없는 상태로 연습하기 때문에 실수할 우려가 있다. 이 항의 실습은 필자가 안내하는 그대로 베끼듯이 따라 하라.

혹시 실수로 입력해서 화면이 변한 경우는 디버그를 새로 시작하라.

작은 실수가 생기더라도 부팅을 다시 하는 이상의 사고는 없을 것이다.

1. 두 수의 합과 차 구하기

디버그를 사용하려면 먼저 debug.exe를 실행해야 된다.

debug.exe 파일은 dos 방에 들어 있을 것이고, dos 방은 autoexec.bat 파일의 path에 등록되어 있다면, 아무 방(...)에서라도 debug<Enter>로 실행할 수

있다.

    ...> debug <Enter>

    - h 200 100 <Enter>

    03000100

    -

둘째 줄에서, 우리는 16진수로 200과 100의 합과 차를 구하라고 명령했다.

그러자, 셋째 줄에 그 합은 0300이며 차는 0100이라고 알려 주었다.

이 예제에서 우리는 두 가지를 이해하고 넘어가자.

    (1) 디버그는 계산 결과를 4 자리 수로 표시하였다.

    (2) 4 자리 중 숫자가 없는 왼쪽 자리는 0으로 채운다.

지시한 작업을 끝내었으므로 넷째 줄의 -로 다음 명령을 기다리는 것이다.

다시 비슷한 명령을 해 보자.

    - h 8 9 <Enter>

    0011ffff

    -

먼저는 200과 100을 보태어 300이 나오고 빼서 100이 나왔다.

그것은 쉽게 이해가 되었는데, 이번에는 사정이 좀 다를 것이다.

8과 9를 합하여 11이 된다는 것도 이상하고, 또 8에서 9를 빼면 -1이 될 것인데 이상하게도 ffff라니 무슨 소린지 도무지 알 수 없을 것이다.

사람은 손가락이 열 개라 10진수를 쓴다는 말을 들은 기억이 난다.

컴퓨터의 손가락이 16 개인 것은 아니겠지만, 디버그는 16진수를 쓴다.

따라서 0011의 왼쪽 1은 10진수로 하면 16에 해당되는 것이다.

결국 0011을 10진수로 환산하면 0 + 0 + 16 + 1 = 17이 된다.

8에서 9를 더하면 17이 되니까, 컴퓨터가 한 계산은 정확하였다.

ffff에 관해 설명하자면 길어진다. 다만 각 자리의 f는 10진수로는 15에 해당되며 16진수에서는 가장 큰 숫자라는 것만 알고 넘어가자.

그리고 또 한 가지 ffff가 -1과 같이 쓰인다고 믿고 넘어가자.

10진수, 2진수, 16진수에 관하여 상당히 알고 있는 사람에게는 더 이상의 설명이 필요없을 것이다. 그러나, 잘 모르는 분들을 위해 약간의 설명이 필요하다.

그 설명은 지금 하면 머리가 아플테니 조금 있다가 하자.

2. 한 글자를 출력하기

디버그를 이용하여 간단한 프로그램은 손쉽게 만들 수 있다.

우선 맛을 보아야 더 공부하고 싶은 용기가 생길 것이다.

디버그를 아직 끝내지 않았으면 - 프롬프트에 그대로 입력하면 된다.

만약 끝내었으면 debug<Enter>하여 - 프롬프트를 불러 내자.

그리고 다음과 같이 입력해 보라.

빈칸은 Tab으로 띄워 주면 보기에 좋다.

내용 입력과 <Enter>(엔터) 사이는 띄울 필요가 없다.

    -a100 <Enter>

    ????:0100 mov dl,24<Enter> * 출력할 문자의 코드값을 dl에 저장 *

    ????:0102 mov ah,2<Enter> * 문자출력 명령(16진수 02)를 ah에 저장 *

    ????:0104 int 21<Enter> * ah에 저장된 명령을 실행하는 명령 *

    ????:0106 int 20<Enter> * 프로그램 실행 끝내기 명령 *

    ????:0108 <Enter>

위에 ????와 같이 표시한 부분은 어떻게 나오든 무관하다.

이것으로 프로그램은 끝났다.

아스키 코드표를 보면, 16진수 24(10진수 36)에는 문자 $가 배정되어 있다.

위의 프로그램은 그 문자를 화면에 출력해 주는 것이다.

각 줄의 오른쪽에 붙인 설명을 보고 대충 짐작하고 넘어가자.

처음부터 자세한 설명을 하면, 오히려 힘들어진다.

디버그 안에서 만든 프로그램을 실행하는 명령은 g<Enter>이다.

    -g <Enter>

    $

    Program terminated normally

    -

첫 줄의 $ 문자는 우리가 입력한 mov dl,24와 mov ah,2 및 int 21이라는 세 줄의 명령에 따라 표시된 것이다.

다음 줄은 int 20이라는 명령이 실행된 결과이다.

원래 g <Enter> 명령은 go till을 의미하는 것으로 g <번호> <Enter>과 같이 입력하면 현재 번지로부터 <번호>에 지시한 번지 직전까지 실행하고 중단하게 된다.

위의 상태에서 다시 다음과 같이 명령해 보자.

g106과 같이 붙여 써도 무방하지만, 보기 좋게 표시하였다.

    -g 106 <Enter>

    $


    ................... IP=0106 ...........

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

    -

위에서도 점선으로 생략한 부분은 어떤 내용인지 지금은 몰라도 된다.

IP 번지 0100에서 시작하여 0105까지 실행을 마치고 멈추었다.

그래서 위 화면에 나오는 IP 번지가 0106으로 보이는 것이다.

이제 다시 한 번만 더 명령을 내려 보자.

    -g <Enter>


    Program terminated normally

    -

이로써, 우리가 처음 프로그램의 마지막 줄에 입력했던 int 20이라는 명령이 단순히 프로그램을 정상적으로 끝내 주는 역할만 한다는 사실이 확인되었을 것이다. 이 정도의 이해를 했으면, 입문 맛보기로는 충분하다고 믿자.

디버그 맛보기를 끝내고 도스로 나가자.

    -q <Enter>

    ...>

3. 맛보기를 마치며

맛보기는 간단한 것이 좋다.

두 수를 더하고 빼라는 명령 정도 실행하는 디버그라고 무시하지 말자.

한 글자를 출력하기 위해 그렇게 어려운 작업을 해야 되는가 상심하지 말자.

한 글자를 출력할 수 있으면, 많은 내용도 출력할 수 있는 법이다.

사실 컴퓨터가 아는 것은 0과 1이라는 두 개의 숫자 뿐이다.

그러나, 컴퓨터로 할 수 있는 일은 무궁무진하다.

우리가 사소한 기능을 무시한다면, 멋진 프로그램도 만들 수 없을지 모른다.

    ## 주의

처음부터 완전한 프로그램을 짤 수는 없는 노릇이다.

그렇게 하다가는 질려서 금방 그만 둘 우려가 농후하다.

여러분이 재미를 느낄 수 있도록 안내를 하는 것이 목적이므로, 처음 얼마 동안은 프로그램의 부족한 점 등을 지적하지 않고 넘어간다.

말하자면 상황이 바뀌는 데 따라서 보완될 점 등을 무시한다는 말이다.

따라서, 베끼듯이 따라 오기 바란다.

어느 정도 지나면 깊은 내용을 공부하게 될 것이다.

그 때 가서는 상당히 깊은 내용도 힘들지 않게 되어 있을 것이다.

잠시 쉬었다가 다음 장에서 프로그래밍 공부를 계속하기로 하자.

제 03 절 디버그 명령 일람

디버그의 명령에는 무엇이 있으며, 그 용법은 어떻게 될까?

궁금하면 물어 보면 된다.

    ## 필자통신

이 절은 후일의 참고용으로 족하며, 실력이 생기면 이 절의 내용을 수정하여 마음에 들게 만들어 두고 참고하기 바란다.

지금은 부담스러우면 읽지 않고 넘어가도 무방하다.

그러나 모르면서라도 한 번 읽어 두면 손해는 없다.

디버그에게 묻는 명령은 ?(의문표) 하나와 <Enter>만으로 족하다.

아래의 내용은 지금은 참고로 한 번 읽기만 하고 넘어가도 된다.

    ...> debug <Enter>

    - ? <Enter>

    assemble A [address]

    compare C range address

    dump D [range]

    enter E address [list]

    fill F range list

    go G [=address] [addresses]

    hex H value1 value2

    input I port

    load L [address] [drive] [firstsector] [number]

    move M range address

    name N [pathname] [arglist]

    output O port byte

    proceed P [=address] [number]

    quit Q

    resister R [resister]

    search S range list

    trace T [=address] [value]

    unassemble U [range]

    write W [address] [drive] [firstsector] [number]

    allocate expanded memory XA [#pages]

    deallocate expanded memory XD [handle]

    map expanded memory pages XM [Lpage] [Ppage] [handle]

    display sxpanded memory status XS

    -

위의 내용을 이 자리에서 다 설명할 수도 없고, 그럴 필요도 없다.

우리는 실습을 통하여 자연스럽게 하나씩 익히게 될 것이다.

힘들여 외우기만 해서 나의 실력이 되는 것은 아니기 때문이다.

그러나, 나중의 참고를 위하여 각 명령의 간단한 용도만 정리하고 넘어가자.

    ? 디버그 명령의 목록을 보여 준다.

    a 8088 계열의 어셈블리 언어로 어셈블한다.

    c 메모리 중 한 블럭의 내용을 비교한다.

    d 메모리 중 한 부분의 내용을 보여준다.

    e 지정한 주소부터 메모리에 내용을 입력한다.

    f 메모리의 지정한 부분을 어떤 값으로 채운다.

    g 메모리에 있는 실행 파일을 실행한다.

    h 16진수 2 개의 합과 차를 구한다.

    i 지정한 포트(I/O 포트) 주소로부터 1 byte의 내용을 출력한다.

    L 파일 또는 디스크 섹터의 내용을 메모리로 읽어 들인다.

    m 메모리의 한 블럭을 다른 위치로 옮긴다.

    n L과 m 명령에 대한 파일 이름을 지정하거나, 테스트할 파일에 대한 매개변수를 지정한다.

    o 출력 포트에 한 바이트를 보낸다.

    p 루프, 반복되는 문자열 명령, 소프트웨어 인터럽트, 또는 서브루틴을 실행한다.

    q 디버그를 끝내고 도스로 나간다.

    r 레지스터의 내용을 출력, 또는 출력하고 변경하게 한다.

    s 지정 바이트 값을 가지는 메모리 번지를 찾는다.

    t 하나의 명령만 수행하고, 레지스터의 상태를 보여 준다.

    u 16진수로 역어셈블하여 텍스트 상태로 보여 준다.

    w 디버그된 내용을 디스크에 기록(저장)한다.

    xa EMS를 할당한다.

    xd EMS를 해제한다.

    xm EMS의 페이지를 보여 준다.

    xs EMS의 상태를 나타낸다.

위에 설명한 내용이 무슨 뜻인지 하나도 몰라도 무방하다.

적당히 편한 대로 생각하고 넘어가면 된다.

이제 하나씩 되도록 쉽게 배우게 될 것이며, 위의 요약은 디버그를 어느 정도 공부하다가 궁금할 때 참고하기에는 안성맞춤일 것이다.

ID:
PW:

     0 분
     1 분

자유게시판

건강백과 HOME

홈페이지 HOME

조   약     HOME

생활지혜 HOME

서식양식 HOME

법원 전산양식 검색

In Na zum

비공개 HOME

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

◁ 2002.9.1.~2019.11.15. ▷

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