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

홈페이지HOME

PHP

JavaScript

HTML

CSS

드롭다운메뉴

제로보드4

도   움   말

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

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

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

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

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

관주성경 TTS 일반파일 TTS

바이블로 Bible_ro 다운로드

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

[도움말 보기] 바로가기

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

asm_08.

(16진수 출력 Ⅱ)



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

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

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

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

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

열심히 배웁니다.

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






제 08 장  16진수 출력 Ⅱ

우리는 앞 장에서 16진수 1 자리를 출력하는 프로그램을 만들어 보았다.

아직은 미숙하지만, 그동안 우리는 전에 몰랐던 많은 지식을 익혔다.

단순히 이론만이 아니라 실제로 적용하면서 배운 것은 오래 남을 것이다.

이제 16진수 2 자리를 출력하는 프로그램을 만들어 보자.

그러기 위해서는 새로운 비트 회전 명령어 shr(shift right)와 사칙 연산이 아니라

논리 연산 명령어인 and에 대해서 알아야 된다.

새로운 명령어 두어 개를 배우는 것은 별 부담이 되지 않을 것이다.

또한, 16진수 2 자리를 출력하는 방법을 배우고 나면 3 자리나 4 자리를 출력하는

프로그램도 머리 속으로 얼마든지 그려 볼 수 있는 힘을 얻게 될 것이다.

이제 우리는 프로그래밍의 왕초보자 딱지를 떼려는 시점에 와 있다.


제 1 절  비트 이동 명령어 SHR

16진수 1 자리는 4 비트 즉 2진수로 4 자리가 된다.

4 개의 비트를 묶어 니블(nibble)이라는 단위로 표시하기도 한다.

우리가 16진수 2 자리 이상을 출력하려고 한다면, 니블 단위로 비트 회전을 시키는

기술을 습득할 필요가 있을 것이다.

나아가 앞에서 배운 rcl(rotate carry left) 명령은 1 비트씩 왼쪽으로 이동시키므로

그 명령으로 16진수 2 자리의 상위 숫자를 출력해 보려면 바이트 단위의 비트 회전을

5 번 해 주어야만 가능하다.

(위의 설명이 이해되지 않으면 rcl 명령에 대해 설명한 부분을 다시 보라.)

이것은 니블 단위의 이동과는 어울리지 않는다.

만약 비트 단위로 오른쪽으로 이동시키는 명령어가 있다면, 니블 단위의 이동으로

16진수 상위 자리 숫자를 출력해 볼 수 있을 것이다.

이상의 설명이 약간 어렵게 느껴 지더라도 그대로 넘어가 실제로 프로그램을 만들어

보면 저절로 이해가 될 것이라고 생각한다.

따라서 우리는 새로운 비트 이동 명령어 shr(shift right)을 배우려고 한다.

앞에서 우리는 rcl 명령어를 비트 회전 명령어라고 불렀다.

그리고 실제로 그 명령어를 사용한 결과 레지스터의 각 비트는 임시 정류장과도

같은 캐리 플래그를 거쳐 다시 레지스터로 돌아 들어왔다.

그러나 shr 명령어를 사용한 효과는 그와 다르다.

일단 레지스터에서 캐리 플래그로 밀려 나간 비트는 다음 비트가 캐리 플래그로

들어오면 레지스터로 되돌아가는 것이 아니라 영원히 사라진다.






1.  rcl 명령 복습

앞에서 배운 rcl 명령을 간단히 복습해 보자.


     - r bx <Enter>

     BX 0000

     : f1 <Enter>

     - a 100 <Enter>

     ????:0100rcl bl,

    1 <Enter>

     ????:0102 <Enter>

     -


위와 같이 프로그램을 짜고, t <Enter>, r ip <Enter>, 100 <Enter>와

같은 3 가지 명령을 반복 실행해 보면 2진수 11110001b(16진수 F1h)의 왼쪽 1 비트씩이

차례로 캐리 플래그를 거쳐 오른쪽 비트로 보충되면서 값이 변하는 사실을 확인할

수 있었다.

위 프로그램이 바이트 즉 8 비트 단위의 회전이므로 캐리 플래그의 1 비트를 포함하여

9 번 실행한 후 bl 값은 다시 F1(11110001b)로 회복되는 것도 알았다.

rcl 명령은 1 비트씩 회전시키되 왼쪽으로 향한 것이었다.


2.  shr 명령

shr 명령은 rcl 명령과 반대 방향으로 비트 이동을 시킨다.

즉 1 비트씩 이동시키는 점은 같지만 오른쪽으로 이동시키는 것이다.

원시적이지만, 위에서 본 프로그램과 동일한 모양으로 먼저 만들어 보자.


     - r bx <Enter>

     BX 0000

     : f1 <Enter>

     - a 100 <Enter>

     ????:0100shr bl,

    1 <Enter>

     ????:0102 <Enter>

     -


위와 같이 프로그램을 짜고, t <Enter>, r ip <Enter>, 100 <Enter>와

같은 3 가지 명령을 반복 실행해 보면 2진수 11110001b(16진수 F1h)의 오른쪽 1 비트씩이

차례로 캐리 플래그로 밀려 나간다.

4 번을 반복 실행하고 나면 하위 니블 즉 오른쪽의 4 비트(0001)이 모두 밀려

나가고 그 자리에는 상위 니블 즉 왼쪽에 있었던 4 비트(1111)이 들어 앉게 된다.






3.  간편한 실행

위와 같이 동일한 명령을 거듭거듭 실행하는 것은 매우 번거로운 일이다.

편법을 써서 손쉽게 실행할 수 있는 연습 프로그램을 만들어 보자.


     - a 100 <Enter>

     ????:0100mov bx,

    f1 <Enter>

     ????:0103shr bl,

    1 <Enter>

     ????:0105jmp 0103

    <Enter>

     ????:0107 <Enter>

     -


위의 프로그램은 소위 무한 루프를 형성하는 것으로 g <Enter> 명령으로

실행한다면 에러가 나겠지만, t <Enter> 명령을 반복하면서 변화를 살피기에는

적격이다.

mov ... 명령이 한 번 실행된 후에는 t <Enter> 명령만 계속하면 shr ...

명령과 jmp ... 명령이 순환 실행되면서 실제로는 shr bl,1<Enter> 명령만

실행하는 효과가 난다.


4.  니블 단위 이동

이제 우리가 아는 지식을 종합하여 니블 단위의 이동을 간편하게 실행해 보는

실습용 무한 루프 프로그램을 만들어 보자.


     - a 100 <Enter>

     ????:0100mov dx,

    cdef <Enter>

     ????:0103mov cl,

    4 <Enter>

     ????:0105shr dx,

    cl <Enter>

     ????:0107jmp 0105

    <Enter>

     ????:0109 <Enter>

     -


위의 프로그램을 정확하게 입력하고, t <Enter> 명령만 반복해 보라.

그러면, dx 레지스터의 값이 cdef에서 0cde, 00cd, 000c, 0000으로 차례로 변하는

것을 확인할 수 있을 것이다.

그러나 cdef를 다시 찾지는 못할 것이다.

그 점은 rcl 명령과의 차이점으로 위에서 설명한 바 있다.






제 2 절  논리 연산 명령어 AND

16진수 2 자리로 된 수를 출력하기 위한 프로그램으로 만들기 전에 한 가지 더

알아 둘 유용한 명령어가 있다.

수학의 집합에서 "and(그리고)"라는 말은 "이면서 동시에"라는

뜻으로 앞뒤에 있는 두 가지 조건을 모두 만족시키는 부분(교집합)을 가려 내는 데

쓰인다.

그와 달리 "or(또는)"이라는 말은 "이거나 또는"의 뜻으로

앞에 있는 조건이나 뒤에 있는 조건 중 하나라도 만족시키는 모든 요소(합집합)을

구하는 데 쓰인다.

디버그의 and 명령어는 두 수를 비트 단위로 비교한다는 점이 다르다.

두 수를 자리에 따라 비트 단위로 비교하여 둘 다 1이면 1이라는 값을 주고, 만약

둘 중 하나 또는 둘 다가 0이면 0이라는 값을 주는 것이다.

이 명령어는 유용하게 사용될 수 있다.


1.  비트 단위의 논리 연산

이제 우리는 좀 더 체계적인 공부를 위하여 각 비트의 자리 이름을 정하자.

어떤 수를 2진수로 표시했을 때, 맨 오른쪽 자리를 비트 0 위치라고 부르고 그로부터

왼쪽으로 가면서 차례로 비트 1, 비트 2, 비트 3, ... 등으로 표시한다.


     비트 (7) (6) (5) (4)  (3) (2) (1) (0) :

    각 자리의 이름을 표시

     2진수 1 1 1 1

     0 0 0 1=

    16진수 F1


이렇게 약속을 해 두면, 설명하기도 좋고 알아 보기도 좋다.

예를 들어 bl 레지스터와 cl 레지스터에 있는 두 수를 and 연산하면, bl의 (0)

비트 숫자와 cl의 (0) 비트 숫자를 조사하여 둘 다 1인 경우에 연산 결과값의 (0)

비트 자리에 1이라는 값을 주며, 둘 중 하나라도 0이 있으면 0이라는 값을 준다.

우선 16진수 f1과 16진수 1b를 and 연산해 보자.

16진수 f1은 11110001b이고, 16진수 1b는 00011011b이다.


     비트 (7) (6) (5) (4) (3) (2) (1) (0)

     F1h1 1 1 1 0 0 0 1

     1Bh0 0 0 1 1 0 1 1

    -------------------------------------------------------------------------

     11h0 0 0 1 0 0 0 1


F1h와 1Bh의 같은 비트 자리에 둘 다 1이 있는 곳은 비트 (4)와 비트 (0)이다.

따라서 연산 결과는 00010001b로 11h가 되었다.






2.  0Fh를 이용한 AND 연산

우리가 직접 계산해 본 and 연산의 결과에서 2 가지의 법칙을 발견할 수 있다.

그 1 가지 법칙 - 만약 한 쪽 수의 어느 비트 숫자가 1이면, 결과값의 그 비트는

상대편 수의 그 비트 숫자를 그대로 따라 간다는 사실을 알 수 있는 것이다.

위의 계산표에서 먼저 F1h를 중심하고 생각해 보면, (7) (6) (5) (4) (0) 등 5

자리가 1인데 연산 결과값의 그 모든 자리 숫자는 1Bh와 동일하게 되었다.

반대로 1Bh를 중심하고 생각해 보더라도, (4) (3) (1) (0) 등 4 자리가 1인데

연산 결과값의 그 모든 자리 숫자는 F1h와 동일하게 되었다.

그 2 번째 법칙 - 만약 한 쪽 수의 어느 비트 숫자가 0이면, 결과값의 그 비트는

상대편 수의 그 비트 숫자를 무시하고 0으로 고정된다.

F1h의 (3) (2) (1) 자리, 1Bh의 (7) (6) (5) (2) 자리는 0인데 연산 결과값을

보면 상대편 수의 그 자리가 1이든지 0이든지 결과는 0으로 되었음을 알 수 있다.

이 성질을 이용하면 2 자리의 16진수에 0Fh를 and 연산하여 비트 (0)에서 (3)까지만

남김으로써 결과적으로 16진수의 1 자리만 남길 수 있게 된다.

어떤 수이든지 2 자리의 16진수에 0Fh를 and 연산하면 0 ( 는 0에서 f 중 한 숫자)이라는

결과값이 나온다는 말이다.


     F1h1 1 1 1 0 0 0 1

     0Fh0 0 0 0 1 1 1 1

    -------------------------------------------------------------------------

     01h0 0 0 0 0 0 0 1


F1h에 0Fh를 and 연산한 결과는 01h가 되었다.

어떤 2 자리 16진수에 0Fh를 and 연산하면 상위 4 비트를 0으로 만들 수 있다.


     - and??, 0F


위의 연산 결과는 0?가 될 것이다.

이 정도면 0Fh를 이용한 and 연산에 관해서는 충분히 이해했을 것이다.






제 3 절  16진수 출력 프로그램

이제까지 배운 내용을 참고하여 이미 만들어 보았던 1 자리 16진수 출력 프로그램을

응용하면 간단하게 2 자리 16진수를 출력하는 프로그램을 만들 수 있다.

우선 만들어 두고 약간의 설명을 보충하면 충분할 것이다.


     - a 100 <Enter>

     ????:0100mov ah,

    02 <Enter>( 1)

     ????:0102mov dl,

    bl <Enter>  ( 2)

     ????:0104mov cl,

    04 <Enter>  ( 3)

     ????:0106shr dl,

    cl <Enter>  ( 4) * 상위 4 비트 출력 준비 *

     ????:0108add dl,

    30 <Enter>  ( 5)

     ????:010Bcmp dl,

    3a <Enter>  ( 6)

     ????:010Ejl0113

    <Enter>  ( 7)

     ????:0110add dl,

    07 <Enter>  ( 8)

     ????:0113int 21

    <Enter>  ( 9)

     ????:0115mov dl,

    bl <Enter>  (10)

     ????:0117and dl,

    0f <Enter>  (11) * 하위 4 비트 출력 준비 *

     ????:011Aadd dl,

    30 <Enter>  (12)

     ????:011Dcmp dl,

    3a <Enter>  (13)

     ????:0120jl0125

    <Enter>  (14)

     ????:0122add dl,

    07 <Enter>  (15)

     ????:0125int 21

    <Enter>  (16)

     ????:0127int 20

    <Enter>  (17)

     ????:0129 <Enter>

     -


위 프로그램에서 add, cmp, jl, add, int 21h로 묶어지는 명령어 집단이 두 군데에

반복해서 나오는데 그 내용은 이미 자세히 설명한 바 있다.

이 장에서 새롭게 정리할 중요한 것은 (4) 명령줄과 (11) 명령줄이다.

명령 (4)에서는 하위(오른쪽) 4 비트를 잘라 버리고 상위(왼쪽) 4 비트를 그 자리에

채워 넣음으로써 결국 2 자리 16진수의 높은 자리 숫자를 출력하게 된다.

반대로 명령 (11)에서는 and 연산으로 상위 4 비트를 0으로 만들어 버리고 결국

2 자리 16진수의 낮은 자리 숫자를 출력하게 된다.

순서를 뒤바꾸어 먼저 낮은 자리 숫자를 출력하고 다음에 높은 자리 숫자를 출력하면

어떻게 될까?  EFh를 입력했는데 FEh가 출력될 것이다.

프로그램을 다 입력했으면, u 100 <Enter> 명령으로 정확하게 입력되었는지를

다시 한 번 확인하기로 하자.  확인하는 수고는 아끼지 않는 것이 현명하다.






이제 r bx <Enter> 명령으로 bl 레지스터에 2 자리 16진수를 마음대로 입력하자.


     - r bx <Enter>

     BX 0000

     : cd <Enter>

     -


그리고 나서 g <Enter> 명령으로 실행해 보자.


     - g <Enter>

     CD

     Program terminated normally

     -


다시 r bx <Enter> 명령으로 다른 수를 입력하고 g <Enter> 명령으로

실행해 보자.

프로그램을 저장해 두기를 원한다면, 먼저 이름을 짓고 크기를 지정하고 마지막으로

디스크에 기록하여 저장하자.


     - n hex_dbl.com <Enter>

     - r cx <Enter>

     CX 0000

     : 129 <Enter>

     - w <Enter>

     Writing 00129 bytes

     - q <Enter>

     ...>


너무나 열심히 공부하다 보면, 디버그를 빠져 도스로 나가는 명령도 잊어버리고

있을지 모른다.  디버그를 끝내는 명령은 quit을 뜻하는 q <Enter>이다.

이 장의 공부는 이 정도로 마치자.

아무쪼록 많이 두드려 보는 것이 빨리 익히는 지름길이다.

이론이나 명령어를 억지로 외우기보다는 그 이론과 명령어를 적용하는 프로그램을

실제로 만들어 실행하다 보면 저절로 외워지기 마련이다.

이것은 필자의 경험에서 우러나온 충고이다.

필자가 설명하는 방식 외에도 생각이 미치면 얼마든지 예제 프로그램을 만들어서

실험해 보기 바란다.

아무리 큰 실수를 하더라도 컴퓨터가 통째 망가지는 일은 생기지 않는다.

창의력을 갈고 일구는 이들에게 미래가 달려 있음을 필자는 믿는다.



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