흔히 빅 인터거(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;
}
큰 수를 여러 작은 수로 쪼개는 것이 해결방법.
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;
}
'프로그래밍 > 테크닉' 카테고리의 다른 글
| 제곱근(sqrt) 함수를 구현해보자. (2) | 2008/11/26 |
|---|---|
| 키사노바횽 블로그// 스택 침범해서 원하는 코드 실행시키기 (0) | 2008/11/24 |
| 아트 코딩, 변태 코딩의 도화선 (4) | 2008/11/12 |
| 키사노바횽 블로그// double을 위한 난수 발생기 (0) | 2008/11/10 |
| BCD와 일반적인 2진표현 (0) | 2008/07/10 |
| 문자열을 정수로(DWORD보다 큰) (0) | 2008/07/09 |
| DWORD보다 큰 단위의 정수 더하기 (0) | 2008/07/09 |
TRACKBACK 0 AND
COMMENT 0

PREV