본문 바로가기
코스웨어/12년 내장형하드웨어

assembly 나눗셈

by 알 수 없는 사용자 2012. 9. 3.
728x90
반응형

●어셈블리의 나눗셈.

일반적으로 나누기를 하게 되면 잿수와 피잿수 그리고 몫과 나머지로 나뉘게된다. 우리가 어셈블리의 나눗셈에서 알아야 할 것은 잿수와 피잿수와의 관계, 몫과 나머지가 저장되는 공간 그리고 부호에따라 어떻게 값이 변하는지에 대해서 살펴 볼 것이다.

 

▶di_idiv_test.asm

.386
.MODEL FLAT

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD

INCLUDE io.h

cr EQU 0Dh
Lf EQU 0Ah

.STACK 4096

.DATA

number DWORD ?
prompt BYTE "Enter Frist Number : ", 0
string BYTE 40 DUP (?)


.CODE
_start:
;---------------[6]. 나누기
;mov    eax, 10
;mov    ebx, 6
;div    bl                 ; ah(나머지): al(몫) = ax /bx

;---------------[7].
;mov    edx, 0
;mov    eax, 064h
;mov    ebx, 0bh
;div    ebx

;---------------[8].
;mov    edx, 0
;mov    eax, 10
;mov    ebx, 6
;div    bx

;---------------[9].
;mov    dx, 0
;mov    ax, 064h
;mov    cx, 0bh
;idiv   cx

;---------------[10]. 양수 나누기 음수
;mov    edx, 0
;mov    eax, 064h
;mov    ecx, 0fff3h
;idiv   cx

;---------------[11]. 음수 나누기 양수
;mov    edx, 0ffffh
;mov    eax, 0ff9ch
;mov    ecx, 0dh
;idiv   cx

;---------------[12]. 음수 나누기 음수
;mov    edx, 0ffffh
;mov    eax, 0ff9ch
;mov    ecx, 0fff3h
;idiv   cx

;---------------[13]. 잿수에따른 몫과 나머지 저장공간의 관계
;mov    eax, 0fe01h
;mov    ebx, 0e0h
;idiv   bl

;---------------[14]. CDQ의 쓰임
;mov    eax, 064h
;cdq                           ; EAX > EDX:EAX

;---------------[15]. CWD의 쓰임
;mov    edx, 0ffffffffh
;mov    eax, 0ffff070dh
;cwd                           ; AX > DX:AX

;---------------[16]. CBW의 쓰임
mov    eax, 0ffffff0dh
cbw                            ; AL > AH:AL

INVOKE ExitProcess, 0

PUBLIC _start

END

 

[6]. 나누기

 

 

일반적인 나누기이다. 10 / 6 = 1 ... 4이다.

레지스트를 보면 al에 몫 1.

             ah에는 나머지 4.

 

[7]

 

 

100 / 11 = 9 ... 1

레지스트를 보면 eax에 몫 9.

             edx에 나머지 1.

곱셈과 마찬가지로 edx를 저장공간으로 쓰는 것을 알 수 있다.

 

[8]

 

 

10 / 6 = 1 ... 4

레지스트를 보면 ax에 몫 1.

             dx에 나머지 4.

 

[9]

 

 

idiv로 나누기한 결과이다. 100 / 11 = 9 ... 1

레지스트를 보면 ax에 몫 1.

             dx에 나머지 4.

별다를 것이 없다. 그냥 div한 것과 같다. 다만 위의 7번과 다른점은 dx의 상위 비트가 다르다는 것 인데 [7]은 eax로누어서 edx가 모두 사용된 것이며 이번에는 cx로 나누서서 dx만 사용되었다. 이렇게 잿수에 의해서 사용되는 값이 달라짐을 확인하엿다.

 

[10]. 양수 나누기 음수

 

 

100 / -13 = -7 ... 9

레지스터를 살펴보기 전에 잠깐 음수인 16진수를 10진수로 바꾸는 방법을 알아보자.

위 16진수는 FFF3이다. (제일 앞자리에 1로 채워졌으므로 음수)

2진수로 풀어적으면 1111 1111 1111 0011 (2)

                0000 0000 0000 1100 (2) 1의 보수

                0000 0000 0000 1101 (2) 2의 보수 

2의 보수를 10진수로 바꾸면 13이다. 본디 음수이므로 -13임을 확인하였다.

 

레지스트를 보면 ax에 몫 fff9. (fff9는 -7이다.)

             dx에 나머지 9.

 

[11]. 음수 나누기 양수

 

 

-100 / 13 = -7 ... -9

레지스트를 보면 ax에 몫 fff9. (fff9는 -7이다.)

             dx에 나머지 fff7. (fff7은 -9.)

 

[12]. 음수 나누기 음수

 

 

-100 / -13 = 7 ... -9

레지스트를 보면 ax에 몫 7.

             dx에 나머지 fff7. (fff7은 -9.)

 

[13].잿수에 따른 몫과 나머지와의 관계

 

 

-511 / -32 = 15 ... -31

레지스트를 보면 al에 몫 0f. ( 0f는 15 )

             ah에 나머지 e1. ( e1은 -31 )

[9]예제에서 잠깐 설명 했지만 몫과 나머지는 잿수의 크기에 의해서 저장되는 공간이 달라진다. 실제로는 공간이 달라지는 것이 아니라 잿수의 크기에 의해서 피잿수의 크기도 달라지므로 몫과 나머지의 저장공간도 커진다고 하는 것이 옳다.

  ※피잿수의 크기                잿수의 크기

    2byte     [AH, AL]        1byte     [ BL ]   

    4byte     [DX, AX]        2byte     [ BX ]

    8byte     [EDX, EAX]      4byte     [ EBX ]

 

[14]. CDQ의 쓰임

 

 

CDQ는 음수와 양수를 판별하여, EAX를 EDX와 EAX로 확장시킨다.

(4byte를 8byte로 확장)

그림에서는 fffffff9는 음수이므로 EDX에 모두 1을 넣었다.

 

[15]. CWD의 쓰임

 

CWD는 음수와 양수를 판별하여, AX를 DX와 AX로 확장시킨다.

(2byte를 4byte로 확장)

그림에서는 ffff070d는 양수이므로 DX에 모두 0을 넣었다.

 

[16]. CBW의 쓰임

 

 

CBW는 음수와 양수를 판별하여, AL를 AH와 AL로 확장시킨다.

(1byte를 2byte로 확장)

그림에서는 fffff0d는 양수이므로 AH에 모두 0을 넣었다.

728x90