.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을 넣었다. |