1

내가 어셈블리에 인쇄해야 64 비트 정수를 가지고,하지만 난 32 비트 시스템에서 작업하고, 그래서 내 64 비트 정수를 두 개의 32 비트 레지스터에 저장하십시오. 정수의 상위 부분은 % edx에 저장되고 하위 부분은 % eax에 저장됩니다. 어셈블리 : 그들은 것처럼 두 개의 32 비트 레지스터의 값을 사용하여 구분 한 64 비트 정수

난 그냥 지속적으로 10 분할, 32 비트 정수에게 문제를 인쇄하지 않으며 나머지를 인쇄하는 방법을 알고있다.

또한 64 비트 숫자에 32 비트를 곱하는 방법도 알고 있습니다.

는하지만 나를 죽이고하는 부문이다

내가 수집 한 것과

, 나는 내가 같이 두 개의 답을 결합 어떻게 든 열로 내 레지스터 % EDX 및 % EAX의 각 분할,하고 생각 I 곱셈과 함께 하겠지만, 각 부분의 나머지와 지수로 무엇을해야합니까?

나는 32 비트 리눅스 시스템에서 AT & T의 86 구문을 사용하여 GNU 어셈블러로 일하고 있습니다. 덕분에

+0

난 당신이, 즉 충분히 구현하고도 올바른 순서로 숫자를 얻을 쉬워야한다 반복 뺄셈을 사용하는 것이 좋습니다) – Jester

+0

[DIV] (http://www.felixcloutier.com/x86/DIV .html)는 이미 소스 피연산자에 의해 edb : eax를 나눕니다. 64b/32b => 32b division을합니다. 문제는 몫이 eax에 맞지 않으면 나누기 오류 (0으로 나누기와 동일)로 오류가 발생한다는 것입니다. Linux에서는 SIGFPE를 트리거합니다. 몫에 64 비트가 필요할 경우 rcgldr의 대답 만 있으면됩니다. –

답변

2

이 질문은 최근에 몇 번을 보이고있다. 이 알고리즘은 연필과 종이로 나누는 것과 비슷하며 한자리수의 제수로 여러 자릿수의 배수를 나눕니다. 다음은 edi : esi에 64 비트 배당이 유지 된 코드 스 니펫입니다. 이 같은 방법은 메모리에 저장된 매우 큰 배당을 32 비트 제수로 나눌 수 있도록 확장 될 수 있습니다.

 .data 
decstr db  24 dup (0) 
pfstr db  '%','s',0dh,0ah,0 
     .code 
     extrn _printf:NEAR 
_main proc near 
     mov  edi,000000002h   ;edi = high order dvnd 
     mov  esi,04CB016EAh   ;esi = low order dvnd 
     lea  ebx,decstr+23   ;ebx = ptr to end string 
     mov  ecx,10     ;ecx = 10 (constant) 
div0: xor  edx,edx     ;clear edx 
     mov  eax,edi     ;divide high order 
     div  ecx 
     mov  edi,eax 
     mov  eax,esi     ;divide low order 
     div  ecx 
     mov  esi,eax 
     add  dl,'0'     ;store ascii digit 
     dec  ebx 
     mov  [ebx],dl 
     mov  eax,edi     ;repeat till dvnd == 0 
     or  eax,esi 
     jnz  div0 
     push ebx      ;display string 
     push offset pfstr 
     call _printf 
     add  sp,8 
     xor  eax,eax 
     ret 
_main endp 
+1

EDI <= 9가되면 보조 "한 자리 당 한 자리수"루프로 전환 할 수 있습니다. – Brendan

+0

고마워, 내가 잡았다! – antipistachio