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

홈페이지HOME

PHP

JavaScript

HTML

CSS

드롭다운메뉴

제로보드4

도   움   말

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

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

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

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

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

관주성경 TTS 일반파일 TTS

바이블로 Bible_ro 다운로드

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

[도움말 보기] 바로가기

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


asm_84.


음수표현


     29 이형문 buju8t 12/31 950

    12 음수표현에 대해 알아봅시다.







음수와 보수의 표현


 현재까지 취급한 숫자는 모두 양수였으나 계산할 때 음수도 사용되므

로 어셈블리에서 사용되는 보수개념에 대해 알아봅시다.

"보수"란 기준이 되는 수로 부터 어떤 수를 뺀 나머지수를

말합니다.

예를 들어 기준이되는 수를 100으로 잡으면 100 에 대한 5 의보수는 95

가 됩니다.(100-5=95)

이것을 16진수의 1바이트(8비트) 숫자로 대응시켜 봅시다.1 바이트가

표현할 수있는 숫자는 0--255까지의 숫자입니다.


 2^8(=100H;8진수) 를 기준으로 보수를 계산해 봅시다.


2의 보수는 100H-2H = 0FEH

3의 보수는 100H-3H = 0FDH


입니다. -1을 나타내는 데에,1의 보수를 사용하여 0FFH로 나타냅니다.

이렇게 보수표현을 사용하면 바른 덧셈이나 뺄셈을 사용할 수가 있읍니다.


1 + ( -1 ) = 01H + 0FFH = 100H  -->  0

1 + ( -3 ) = 01H + 0FDH = 0FFH  --> -2






 보수표현을 사용한 경우에 어느 수가 음수를 나타낸 것인가를 결정하지

않으면 안됩니다. 예를들어 아무 약속이 없다면 0FDH 가 정수 253 을 나

타내는지,음수 -3 을 나타내는 지 알 수없읍니다.

 그래서,보수표현을 사용한 경우의 약속으로 그 수를 2진수로 나타냈을 때

최상위(MSB)비트가 0이면 양수,1이면 음수로 간주하도록 정하고 있읍니다.

8비트 일경우 숫자는 0--7FH 까지가 양수,80H--0FFH까지는 음수를,16 비트

이면 0--7FFFH까지가 양수,8000H--0FFFFH까지는 음수를 나타냅니다..


MSB

LSB


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

8비트의 경우

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

7 5 4 3 1 0


 MSB

LSB


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

16비트의 경우  

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

 

15

 13  11 9 7 5 4 3

1 0


 프로그램에서 음수를 사용하는지에  따라 보수를 사용할 것인지 아닌지를

결정해야 합니다.






 숫자의 앞에 - 을 붙여 프로그램을 작성하면 그 명령은 단순히 보수로

변환하여 전송됩니다.


예를

들면 보수 표현을 사용한 8 비트 레지스터에서는 -80H -- 7FH 까지

의 숫자를 취급할 수 있읍니다.음수인  -0FFH는 1H로 변환 됩니다. 결국


1H 는 MBS 가 0 이므로 양수의 1 이 됩니다.그럼 이번엔 양수인 두수를

더해봅시다.양수 40H 와 50H를 더하면 결과는 -70H ( 90H 이지만 이 수를

보수 표현으로 바꿔야 하므로) 라는 음수가 나옵니다. 이와 같은 수를

바르게 취급하려면 16비트 레지스터를 이용하면 됩니다.


 모든 수를 양의 정수로서 취급하는 경우에 8비트 레지스터의 값을 16비

트로 확장하는 방법을 알아 봅시다.


MOV  AH,1  ;키보드로 부터 1문자를 입력

받는다.

INT 21H

MOV AH,0 ;AX레지스터의 상위 비트에 0을

세트한다.

ADD DX,AX  


이와 같이 16비트 데이터의 하위 바이트에 데이터를, 상위 바이트에 00을

대입하는 것이 되어 간단하게 16 비트 데이터로 확장할 수있읍니다.






* SGN2.SGN ; 숫자를 16비트 레지스터로 변환하는 프로그램.


MAIN  SEGMENT

ASSUME CS:MAIN,DS:MAIN

;

MOV AX,CS

MOV DS,AX

;

MOV AX,0

MOV DX,0

MOV DL,VAR1

 ADD AX,DX

MOV DL,VAR2

ADD AX,DX

MOV DL,VAR3

ADD AX,DX

MOV DL,VAR4

ADD AX,DX

MOV ANS,AX

;

MOV AH,4CH

INT 21H

;

VAR1  DB 50H

VAR2  DB 60H

VAR3  DB 80H

VAR4  DB 0F0H

ANS DW ?

;

MAIN  ENDS

END






 이번에는 보수표현을 사용한 ,부호가 붙은 숫자를 취급하는 방법을 알아

봅시다.

 양수 값을 8비트로 부터 16비트로 변환할 때는 상위바이트에 00을 대입

하면되고, 음수일 경우에는 상위바이트에 FF 를 대입하면 됩니다.


41H --> 0041H

03H --> 0003H

(음)95H --> 0095H ;양수가 되므로 틀렸음 (FF95H로

바꿔줘야합니다.)

(음)F7H --> FFF7H



 이와 같은 작업을 일일이 프로그램을 작성하여 하려고 하면 대단히 힘듭

니다. 그래서 위에서 기술한 규칙에 따라 8비트 숫자를 16비트로 변환해

주는 명령이 잇읍니다. 이 명령을 부호확장명령이라고 합니다.


부호확장명령은 사용할 수있는 레지스터가 한정되어 있읍니다.


 CBW ----AL 레지스터의 숫자를 부호 확장하여 AX레지스터에 저장한다.

 CWD ----AX 레지스터의 숫자를 부호 확장하여 ,상위 16비트를 DX 레지스터

에 ,하위 16비트를 AX 레지스터에

저장한다.


여기서는 CBW 명령에 대해서만 알아 봅시다.






* 부호가 붙은 4개의 숫자를 합하여  ANS에 저장하는 프로그램


MAIN  SEGMENT

ASSUME CS:MAIN,DS:MAIN

;

MOV AX,CS

MOV DS,AX

;

MOV AX,0

MOV DX,AX

MOV BX,OFFSET VAR

MOV AL,[BX]

CBW

ADD DX,AX

MOV AL,[BX]+1

CBW

ADD DX,AX

MOV AL,[BX+2]

CBW

ADD DX,AX

 MOV AL,3[BX]

CBW

ADD DX,AX

MOV ANS,DX

;

MOV AH,4CH

INT 21H

;

VAR DB 50H,60H,80H,0F0H

ANS DW ?

;

MAIN  ENDS

END






 여기서 다시한번 주의할 점은,

 "CBW명령은 AL레지스터로 부터 AX 레지스터로 밖에 변환

할 수 없다"

라는 겁니다. 그래서 AX 는 다음을 위해 사영하지 않고 DX 레지스터를

사용하여 덧셈을 하고 있읍니다.

 4개의 변수는 변수이름 VAR이 나타내는 번지로 부터 연속하여 모여 지

정되어 있읍니다.

이부분은 다음과 같이 지정해 주어도 같읍니다.


 VAR  DB 50H

DB 60H

DB 80H

DB 0F0H


 또한 4개의 변수에 각각 독립된 변수이름이 지정되어 있지 않아 변수의

내용을 꺼내기 위해서 변수이름 VAR이 나타내는 번지로 부터 상대의 위치

를 지정해야 합니다.BX 레지스터에,변수이름 VAR 이 나타내는 오프셋 번지

를 전송하고 있읍니다.


다음의 번지의 표기법은 모두 같은 표기입니다.


[BX]+2  , [BX+2] ,2[BX]


예제  프로그램에서는 [BX]+1  을 VAR +1로 치환할 수 있읍니다.

여기에서 VAR+1이라는 것은 변수이름이 나타내는 번지에 1을 더하라는 명령입니다.



ID:
PW:

     0 분
     5 분

자유게시판

건강백과 HOME

홈페이지 HOME

조   약     HOME

생활지혜 HOME

서식양식 HOME

법원 전산양식 검색

In Na zum

비공개 HOME

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

◁ 2002.9.1.~2021.4.11. ▷

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