DWORD보다 큰 단위의 정수 더하기

Posted by 적분 ∫2tdt=t²+c
2008.07.09 00:05 프로그래밍/테크닉
흔히 빅 인터거(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;
}


이 댓글을 비밀 댓글로