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

홈페이지HOME

PHP

JavaScript

HTML

CSS

드롭다운메뉴

제로보드4

도   움   말

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

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

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

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

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

관주성경 TTS 일반파일 TTS

바이블로 Bible_ro 다운로드

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

[도움말 보기] 바로가기

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

asm_09. (문자, 16진수 입력)



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

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

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

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

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

열심히 배웁니다.

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






제 09 장  문자, 16진수 입력

지금까지 우리는 문자의 출력 방법을 집중적으로 살펴 보았다.

그러면서 출력할 문자를 미리 프로그램에 내장시켜 두든지, 아니면 수시로 다른

문자를 입력하기 위해서는 항상 디버그를 실행해야만 되었다.

그런 프로그램은 독립적으로 실행하기에는 문제가 있는 것이다.

이제 우리는 도스상에서 키보드의 입력을 받아 들이는 문제를 알아 보자.


제 1 절  한 문자 입력

앞에서 우리는 int 21h 명령어가 입출력에 관한 일을 한다고 공부하였다.

그리고 int 21h 함수는 ah 레지스터의 값이 02h일 때 출력을 한다고 알았다.

그렇다면, int 21h 함수로 하여금 입력을 받아 들이도록 만들기 위해서는 어떻게

해야 될까?  ah 레지스터의 값을 01h로 저장해 두면 된다.

간단한 실습용 프로그램을 하나 만들어 보자.


     - a 100 <Enter>

     ????:0100mov ah,

    01 <Enter>

     ????:0102int 21

    <Enter>

     ????:0104int 20

    <Enter>

     ????:0106 <Enter>

     -


위의 프로그램을 정확하게 입력하여 만들었으면 실행을 해 보자.







     - g <Enter>

     3

     Program terminated normally

     -


g <Enter>를 했을 때, 아랫줄에 커서만 나타나 벙어리처럼 기다리고 있는

것을 보고 당황하지 말고 아무 글쇠나 누르면 된다.  위의 예에서는 3을 입력했다.

입력하는 순간 그 아랫줄에 Program terminated normally라는 보고가 나온다.

<Enter>를 누를 시간도 없고, 누를 필요도 없다.

이래서는 실행 과정을 살펴 볼 수가 없다.

r <Enter> 명령을 해 보아야 모든 레지스터는 초기화되어 있기 때문이다.

명령어를 하나씩 차례대로 실행해 보기로 하자.

개별 명령어를 실행할 때 반드시 주의할 점 int 명령어는 t <Enter>로 실행해서는

안 된다는 점을 잊지 말자.  달리 실행하는 방법도 우리는 알고 있다.


     - t <Enter>

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

     .................. int 21

     - p <Enter>

     3

     AX=0133 BX= ..................

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

     -


역시 3을 입력한 즉시 레지스터 보고가 나타난다.

<Enter>를 누를 필요도 없고, 누를 수 있는 시간 여유도 주지 않는다.






그보다 우리는 ax 레지스터의 값을 한 번 살펴 보자.

상위 ah에 있는 01은 t <Enter>로 실행한 mov ah,01 명령의 결과 저장된

값이다.

하위 al에 있는 33은 어디서 온 값인가?

우리는 단지 3을 입력했을 뿐인데 말이다.

이런 궁금증은 초보자 시절에는 누구나 가질 수 있는 의문이다.

우리는 아스키 문자 3을 입력하였지만, 컴퓨터는 그 문자의 코드값 33h를 저장하였기

때문에 화면에 33으로 나타난 것이다.

실제로 컴퓨터가 저장한 기계어 코드는 00110011b가 될 것이다.

우리가 2진수를 사용하지 않고 16진수로 프로그램을 짤 수 있는 것만 하더라도

얼마나 편해진 것인지 감사하지 않을 수 없다.

갈수록 더 편한 프로그래밍 언어가 개발되고 있지만, 그 언어를 개발하는 분들은

여전히 어셈블리나 기계어를 애용하고 있음에 틀림이 없을 것이다.

이 절의 마지막 잔소리!

위에 이어서 q <Enter> 명령으로 디버그를 마치든지, 아니면 r ip <Enter>,

100 <Enter> 순서로 ip 레지스터를 원상복구시켜 두고 실행을 계속하도록 하자.


제 2 절  16진수 입력

int 21h 함수로 문자 입력을 받아 들이도록 하려면 ah = 01로 가능하다.

레지스터에 들어 있는 16진수를 그대로 출력하기 위해서는 그 수에 30 또는 37을

보태어 같은 수의 코드값을 만들어 주는 방법으로 가능하였다.

역으로 생각하면 16진수의 입력을 읽어 들이는 방법도 어려울 것이 없다.

즉 입력되는 16진수를 그대로 저장하기 위해서는 그 수의 코드값에서 30 또는

37을 빼 주는 방법으로 가능할 것이다.

실제로 프로그램을 만들어 실행해 보자.






1.  한 자리 16진수 입력 프로그램

16진수의 출력에서와 반대로 16진수의 입력에서는, 0에서 9까지의 16진수가 입력된

경우 30h를 빼 주면 되고 a에서 f까지의 16진수가 입력되는 경우에는 그보다 7이

더 많은 37h를 빼 주면 된다.


     - a 100 <Enter>

     ????:0100mov ah,

    01 <Enter>

     ????:0102int 21

    <Enter>

     ????:0104sub al,

    30 <Enter>

     ????:0106cmp al,

    09 <Enter>

     ????:0108jle o1oc

    <Enter>

     ????:010Asub al,

    07 <Enter>

     ????:010Cint 20

    <Enter>

     ????:010E <Enter>

     -


새로운 점프 명령 jle(jump if less than or equal)는 두 수를 비교하여 왼쪽

수가 오른쪽 수보다 작거나 같으면(오른쪽 수 이하이면) 지정된 주소로 분기한다.

가령 9를 입력했다면, 코드값 39를 받아 들인 후 30을 빼고 남은 수는 9가 되므로

그 9와 오른쪽의 09를 비교하면 같은 수가 된다.

따라서 그 아랫줄의 명령을 무시하고 건너 뛰어 int 20h 명령을 실행하게 된다.

반대로 A를 입력했다면, 코드값 41에서 30을 때고 남은 값 11이 오른쪽의 09보다

크기 때문에 jle 명령의 조건이 거짓이 되므로 점프 명령이 무시되고 바로 아랫줄에

나오는 sub 명령이 실행되어 다시 7을 빼고 남은 값 a를 저장한다.

g <Enter> 명령으로는 명령 실행 과정을 볼 수가 없다.

t <Enter>, p <Enter> 명령으로 한 명령어씩 차례로 실행해 보기로

하자.

먼저 한 번 실행하여 int 21h 명령을 만나면 p <Enter> 명령과 함께 0에서

9 사이의 값을 입력하고 int 20h 명령이 나올 때까지 진행해 보자.

다시 한 번 실행하여 int 21h 명령을 만나면 p <Enter> 명령과 함께 A에서

F 사이의 값을 입력하고 int 20h 명령이 나올 때까지 진행해 보자.

가능하면 여러 번 실행하면서 입력된 코드값이 언제 입력된 문자와 같은 16진수로

변하는지 유심히 살펴 보자.

직접 확인해 볼 줄 믿고 화면 설명은 생략한다.






2.  명령어 단위 실행에서 주의할 점

이 프로그램에서는 a와 같이 소문자로 입력하면 안 된다는 점에 주의하자.

아직은 소문자 입력도 받아 들일 수 있는 기능이 없기 때문이다.

그리고, 실행하기 전에 r <Enter>, r ip <Enter> 등으로 레지스터

상태 및 ip 레지스터의 현재 주소 등을 확인하는 습관은 버리지 않는 것이 좋다.

만약 과정에서 실수로 int 21h 명령을 t <Enter>로 실행했다면, 즉시 레지스터

상태롤 잘 살펴 보자.  cs 레지스터와 ip 레지스터의 주소가 모두 엉뚱한 것으로

바뀌어 있을 것이다.  그 때는 모니터 화면 윗부분에 남아 있는 이전의 cs 레지스터

주소와 ip 레지스터 주소를 복구해 주면 된다.


     - r cs <Enter>

     CS xxxx

     : ???? <Enter>

     - r ip <Enter>

     IP yyyy

     : 0100 <Enter>

     - r <Enter>

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




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