2016-06-07 2 views
-1

32 비트 시스템을 사용하여 64 비트 숫자를 문자열로 변환하는 방법을 찾고 있습니다. 나는 코드를 요구하지 않고 단지 몇 가지 아이디어를 요구한다.64 비트 숫자를 x86 어셈블리의 문자열로 변환하는 방법은 무엇입니까?

+1

이렇게하면 아이디어를 얻을 수 있습니다. http://stackoverflow.com/questions/30243848/assembly-x86-date-to-number-breaking-a-string-into-smaller-sections/30244131#30244131 그것은 16 비트와 32 비트를 위해 만들어졌으며, 64 비트로 고쳐졌습니다. 시도해보십시오. 문제가있을 경우 코드를 게시하면 도움이됩니다. –

+0

정확히 64 비트 숫자를 갖고 계십니까? 'rax '또는 다른 64 비트 레지스터에 있다면 순수 보호 모드 명령 세트로 상위 32 비트에 액세스 할 수 없습니다. – Olipro

+0

@ JoseManuelAbarcaRodríguez 저는이 종류의 어셈블리에 익숙하지 않습니다. 우분투에서 AT & T 문법을 사용하고 있습니다. 나는 다른 크기로 변환하는 것을 알고 있으며, 64 비트 숫자에 대한 어떤 버그는 원래의 64 비트 숫자로 된 두 개의 32 비트 파트 (높고 낮은)를 결합하는 방법입니다. – sstefan

답변

3

유일한 어려운 부분은 32 비트 시스템에서 64 비트 숫자를 10으로 나눈 것입니다. 다른 모든 것은 숫자가 단일 레지스터에 들어있는 일반적인 경우와 거의 같습니다.

종종 당신은 ASM의 일을 수행하는 방법에 대한 힌트 GCC 출력을 볼 수 있지만,이 경우에는 just calls the __udivdi3 libgcc helper function :/

그냥 학습 운동으로이 일을하는 경우, 그럼 아마 당신은해야 확장 정밀도 div 알고리즘을 찾아서 사용하십시오. Here's one은 인텔 구문 및 16 비트 연산을 사용하여 책에서 가져온 것입니다. 변수 이름은 명확하고 설명 텍스트가 있으므로 32 비트로 다시 구현할 수 있어야합니다. 더 많은 조회수를 얻기 위해 Google에서 구문을 사용하거나 libgcc 소스 코드를 살펴보십시오. 당신이 진짜이를 구현하는 경우

는 (고성능) implementing school-like division on 32bit chunks on x86


참조 :

를 86의 div 명령은 64B/32B한다는 것을 기억하십시오 -> 32B 부문 (그러나 결함 경우 몫은 32 비트 레지스터를 오버 플로우시킨다). 따라서 높은 dword의 하위 비트가 충분히 작은 지 확인할 수 있습니다. 그렇다면 높은 자리수를 얻으려면 첫 번째 단계에서 단일 분할 만 필요합니다.

숫자가 단일 div으로 나눌 수있을만큼 작 으면 확장 된 정밀도 루프를 벗어나 숫자 당 div을 사용하십시오.

아마 32 비트 숫자로 줄이기 위해 한 번만 반복하면됩니다. 그 시점에서의 역수를 사용하여 10 분할 할 수있다 : 이것은 전체의 승산 결과의 상위 절반을 사용하는 방법

// from the godbolt link: gcc5.3 -O3 -m32 
uint32_t div10_u32(uint32_t x) { return x/10; } 
    movl $-858993459, %edx  # 0xcccccccd 
    movl %edx, %eax   # gcc is dumb: no need for this mov. clang avoids it 
    mull 4(%esp) 
    movl %edx, %eax 
    shrl $3, %eax 
    ret 

주 (32bx32b-> 64B).


즉 64 X 64B하고 의미에도 불구하고, 곱셈 역수를 사용하여 모든 일을 빠르게 수 있습니다 - 32 비트 시스템에서 다중> 128B를. 정수 부분은 매우 느리며 간신히 파이프 라인되어 있지만 integer mul is very fast on Intel CPUs입니다.

AVX512-DQ adds a 64x64 -> 64b low multiply instruction 그러나 확장 된 정밀도는 아닙니다. AVX512-IFMA는 52bx52b의 로우 및 하이 곱셈 명령어를 추가하기 때문에 몇 년 안에 64-52 비트의 최상위 비트가 0 일 때 (즉, AVX512-IFMA가있는 하드웨어에서 32 비트 바이너리가 실행되는) 코드 경로가 필요할 수 있습니다. 모두 0.

관련 문제