흔히 빅 인터거(Big Integer)라고 부르기도 하는 방법.
큰 수를 여러 작은 수로 쪼개는 것이 해결방법.
inline DWORD _iladdss(DWORD* po,DWORD* pr,DWORD count)
{
if(count==0)return 0;
DWORD carry=0;
__asm{
push esi;
clc;
cld;
mov esi,pr;
mov ebx,[po];
mov ecx, count; //반복회수 count로 지정
iloop:
lodsd;
adc [ebx],eax; //*po값에 *pr을 더함
inc ebx;
inc ebx;
inc ebx;
inc ebx;
loop iloop; //반복실행
jnc icarry;
mov carry,1;
icarry:
pop esi;
};
return carry;
}
DWORD배열로 이루어진 큰 정수를 더해주는 어셈코드.
그리고 최상위비트에서 자리올림이 일어날경우 1을 리턴해줌.
코드분석
inline DWORD _iladdss(DWORD* po,DWORD* pr,DWORD count)
인라인 함수로 _iladdss선언
{
if(count==0)return 0;
DWORD배열의 크기가 0이면 0을 리턴
DWORD carry=0;
최상위자리올림을 저장할 변수 carry선언
__asm{
push esi;
esi의 값을 스택에 집어넣어서 보존시킨다.
clc;
캐리 플래그를 클리어한다.
cld;
방향 플래그를 클리어한다.
mov esi,[pr];
pr의 값을 esi로 옮긴다.
mov ebx,[po];
po의 값을 ebx로 옮긴다.
mov ecx, count; //반복회수 count로 지정
iloop:
lodsd;
esi(pr)이 가리키는 값을 eax로 읽어들인다.
adc [ebx],eax; //*po값에 *pr을 더함
ebx(po)가 가리키는 값에다 자리 올림을 계산하여 eax(*pr)를 더한다.
inc ebx;
inc ebx;
inc ebx;
inc ebx;
ebx의 값을 4증가시킨다. inc는 캐리 플래그를 변화시키지 않는다.
loop iloop; //반복실행
ecx의 값이 0이 될때까지 반복실행한다.
jnc icarry;
캐리플래그가 클리어되어있으면 icarry로 점프한다.
mov carry,1;
(캐리플래그가 세트되어있으므로)carry 값을 1로 한다.
icarry:
pop esi;
esi값을 스택에서 꺼내어 복구시킨다.
};
return carry;
}
댓글 영역