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

홈페이지HOME

PHP

JavaScript

HTML

CSS

드롭다운메뉴

제로보드4

도   움   말

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

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

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

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

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

관주성경 TTS 일반파일 TTS

바이블로 Bible_ro 다운로드

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

[도움말 보기] 바로가기

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


asm_82.


역워드 형식과 ADC 명령


     25 이형문 buju8t 12/29 1049

    12 역워드 형식과 ADC 명령....



 아스키 코드로써 표시할 수 없는 숫자가 결과로서 얻어진 경우에

DEBUG 로 알아봅시다.






* ADD3.ASM


MAIN  SEGMENT

ASSUME CS:MAIN,DS:MAIN

;

MOV AX,CS

MOV DS,AX

;

MOV AX,1000H

MOV BX,1234H

ADD AX,BX

MOV ANS1,AX

;

MOV AH,4CH

INT 21H

;

ANS1  DW ?

;

MAIN  ENDS

END


그럼 디버거를 기동시켜 봅시다.






C:ASM>DEBUG ADD3.ASM

-R


AX=0000  BX=0000  CX=0015  DX=0000  SP=0000  BP=0000

 SI=0000  DI=0000

DS=46E0  ES=46E0  SS=46 F0  CS=46F0  IP=0000 NV

UP EI PL NZ NA PO NC

46F0:0000 8CC8  MOV

AX,CS

-U0

46F0:0000 8CC8  MOV

AX,CS

46F0:0002 8ED8  MOV

DS,AX

46F0:0004 B80010  MOV AX,1000


46F0:0007 BB3412  MOV BX,1234


46F0:000A 03C3 ADD AX,BX

46F0:000C A31300  MOV [0013],AX


46F0:000F B44C  MOV

AH,4C

46F0:0011 CD21  INT

21  

46F0:0013 0000  ADD

[BX+SI],AL  

0013H 번지에 변수 ANSI 영역이

정의됩니다.

46F0:0015 3339  XOR

DI,[BX+DI]  

46F0:0017 7944  JNS

005D  

.

.

.

-Q






원래의 프로그램에서  MOV ANSI,AX 라고 쓰여있는 부분이 역어셈블되면


MOV  [0013],AX


 로 바뀌어져 있읍니다. 즉, 변수 ANSI은 0013H 번지에 할당되기 때문에


이것은 메인프로그램 바로 뒤에 위치하고 있읍니다.


계속 T 커맨드를 실행후 다시 역어셈블해 봅시다.


-T

AX=4C34  BX=1234  CX=0015  DX=0000  SP=0000  BP=0000

 SI=0000  DI=0000

DS=48B0  ES=48A0  SS=48B0  CS=48B0  IP=0011 NV

UP DI PL NZ NA PO NC

48B0:0011 CD21  INT

21  

-U0

48B0:0000 8CC8  MOV

AX,CS

48B0:0002 8ED8  MOV

DS,AX

48B0:0004 B80010  MOV AX,1000


48B0:0007 BB3412  MOV BX,1234


48B0:000A 03C3  ADD

AX,BX

48B0:000C A31300  MOV [0013],AX


48B0:000F B44C  MOV

AH,4C

48B0:0011 CD21  INT

21  

48B0:0013 3422  XOR

AL,22






덧셈한 결과가

여기에 저장되어 있읍니다.


48B0:0015 3339  XOR

DI,[BX+DI]  

.

-Q

 덧셈 결과가 0013H번지에 저장되어 있읍니다. 여기서 역어셈블 결과가

XOR AL,22 라는 것은 단순히 이 데이터를 명령으로 보고  ぞ底은 한 것

으므로 아무의미가 없읍니다.


연산결과는 1000H + 1234H = 2234H 이지만 0013H 번지와 0014H 에는


 3422  


로 저장되어 있읍니다. 상위 바이트의 22H 와 하위 바이트 34H 가 서로

바뀐 형태로 저장되어 있읍니다.

 이것은 80 계열 CPU의 특징적인 현상으로서,16비트 레지스터 상의 데이

터(워드데이터)를 메모리에 전송할 때에는 상위 하위 바이트가 바뀐다라는

규칙이 있기 때문입니다.

 이와 같은 전송방식을 "역워드 형식"이라고 합니다.

 메모리 상의 데응謙拷 레지스터 상으로 전송할 때에는 상하바이트가 다시

바뀌어서 전송되므로 신경쓸 필요는 없읍니다.

 단,바이트형 데이터와 워드형 데이터를 섞어서 취급할 경우 주의해야 합니다.






* ADC 명령


 지금까지는 2개의 16비트 레지스터를 더하면 결과도 16비트 이내로 되는

경우였지만, 이제 결과가 2개의 레지스터로 저장할 수 없는 경우에는 2개의

16비트 레지스터를 사용하여 32비트 숫자를 표시하도록 정해놓고,하위 16비

트를 덧셈할 때에 발생한 자리올림(캐리,carry)을 어딘가에 기억해 놓고 ,

상위 16비트를  덧셈할 때  더해좇獵 방법을 취합니다.


CF  자리올림  예로

1

AX  BX

 1000

 8000  

 +  CX  + DX +

 2000  8123

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

AX' BX'

3001

 0123


 예를 들면 AX 레지스터가 상위 16비트 ,BX 레지스터가 하위 16비트를 나타

내는  것으로 하여 AX,BX를 조합하여 32비트의 숫자를 표현하도록 합니다.

마찬가지로 CX,DX도 그렇게 합니다.

 우선 하위 16비트 씩 BX+DX를 계산하고  결과를 BX 레지스터에 기억합니다

이때, 자리올림이 있다면 기억해둡니다.

다음에 AX+DX를 더한후 기억되어 있던 자리올림도 같이 더합니다.이 것을

AX레지스터에 기억시킵니다.

 한번 덧셈했을 때 자리올림은 ,0 혹은 1이므로 한 비트만 있으면 기억할


수 있읍니다.그래서 그 기억을 위해 설정된 것이 캐리플러그(carry flag)

라고 부르는 비트입니다.

ADD 명령에는 캐리 플러그는 더해지지 않았는데,캐리 플러그도 동시에

더하는 명령으로 ADC (ADdition with Carry)명령이 있읍니다.






* ADD4  --- 10008000H+20008123 을 더하는 프로그램


MAIN  SEGMENT

ASSUME CS:MAIN,DS:MAIN

;

MOV AX,MAIN

MOV DS,AX

;

MOV AX,1000H

MOV BX,8000H

MOV CX,2000H

MOV DX,8123H

ADD BX,DX

ADC AX,CX

MOV ANS1,AX

MOV ANS2,BX

;

MOV AH,4CH

INT 21H

;

ANS1  DW 0

ANS2  DW 0

;

MAIN  ENDS

END






덧셈 결과 상위 16비트가 ANS1에 하위 16비트가 ANS2에 저장되어 있읍니다

그럼 DEBUG 를 기동시켜 봅시다.


-U0,24

4DB0:0000 B8B04D  MOV AX,4DB0


4DB0:0003 8ED8  MOV

DS,AX

4DB0:0005 B80010  MOV AX,1000


4DB0:0008 BB0080  MOV BX,8000


4DB0:000B B90020  MOV CX,2000


4DB0:000E BA2381  MOV DX,8123


4DB0:0011 03DA  ADD

BX,DX

4DB0:0013 13C1  ADC

AX,CX

4DB0:0015 A32000  MOV [0020],AX


4DB0:0018 891E2200  MOV [0022],BX


4DB0:001C B44C  MOV

AH,4C

4DB0:001E CD21  INT

21  

4DB0:0020 0000  ADD

[BX+SI],AL  

4DB0:0022 0000  ADD

[BX+SI],AL  

4DB0:0024 7269  JB  008F

 

-Q






결과는 ,20H와 22H 번지에 저장되어야함을 알 수 있읍니다.

그럼 G커맨드를 사용해 알아 봅시다.

-G=0,1E


AX=4C01  BX=0123  CX=2000  DX=8123  SP=0000  BP=0000

 SI=0000  DI=0000

DS=4DB0  ES=4DA0  SS=4DB0  CS=4DB0  IP=001E NV

UP EI PL NZ NA PO NC

4DB0:001E CD21  INT

21  

-U20,24

4DB0:0020 0130  ADD

[BX+SI],SI  

4DB0:0022 2301  AND

AX,[BX+DI]  

4DB0:0024 7269  JB  008F

 

-Q  

두수를 더한 걋嘯駭 30010123H 이지만 역워드 형식에 의해서 상위워드 3001

이 0130으로 저장되고 하위워드 0123 이 2301 로 저장됩니다.



ID:
PW:

     0 분
     3 분

자유게시판

건강백과 HOME

홈페이지 HOME

조   약     HOME

생활지혜 HOME

서식양식 HOME

법원 전산양식 검색

In Na zum

비공개 HOME

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

◁ 2002.9.1.~2018.6.20. ▷

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