2014-06-09 2 views
1

을 사용하고 C 라이브러리와 가능성의 x86 32 비트 어셈블리를 사용하여, 나는 내 시스템에X86의 32B 어셈블리 -. 우분투 12.04에서 산호 섬

2^31 - 1 < n <= 2^63 -1   

인 숫자 N을 사용할 필요는 C의 int는 32 비트입니다 ; long longs 64 비트입니다. 번호를받은 후에 진행하는 방법을 알고 있지만 번호를 준비하는 일에 매달려 있습니다. 다음과 같이

내 계획 접근 방식이었다

- store n as a string in the .data segment  

- use atoll (pushl $n_Str, call atoll) 

- retrieve the converted value, and store it in two consecutive int-sized storage locations (taking note of likely little-endian storage)   

%의 EAX를 통해 일반적인 32 비트 반환 값 규칙은 (내가 체크 경우가 아닐 것으로 보인다 않은 포인터를 통해서만 가능 적용 (또는 할 수 없으므로 % eax가 접근 할 수없는 메모리를 가리킨다)), 나는 값이 (% eax, % ebx)에 있다고 가정했다. 나는이 사건을 가정하고 높거나 낮은 모든 순열을 조사했으나 그것이 맞지 않는 것처럼 보였다. (만약 그렇다면 엉망이되어 적절한 방법을 지적했다.) 아톨의 남자 (그리고 남자 3) 페이지는 도움이되지 않습니다.

어떻게 변환 된 정수를 검색합니까? 이 접근법이 불가능하다면 (strtoll은 같은 문제를 가지고 있습니다) 대안에 대한 제안은 무엇입니까?

+0

; 그러므로 내가 낮고 높은 단어를 얻으면 나는 괜찮습니다. 나는 손으로 번역하는 것보다 더 많은 것을 필요로한다. 그러나 나는 결국 명령 행 인자로서 ll을 읽을 때 하나의 실행이 쉬울 것이다. – gnometorule

+1

'atoll'을 호출하는 C 프로그램의 어셈블리 소스를 볼 때 어떤 종류의 처리가 보이나요? –

+0

@ssh : ... 좋은 지적 : 없음. 그냥 그렇게하는 것이 내 마음에 오지 않았다. 잠시 만요, 테스트 C 파일을 만들고 gdb를 체크인하면이 문제를 해결할 수 있습니다. – gnometorule

답변

2

호출 규칙 및 컴파일러에 따라 다르게 보입니다. __stdcall 함수는 EAX:EDX 레지스터에 쌍으로 64 비트 정수를 반환합니다. __cdecl 함수는 스택에 대한 포인터를 GCC의 정수로 반환합니다. __cdecl의 기능이 Visual C++이면 EAX:EDX에 한 쌍을 반환합니다. 여기

소스입니다 : 나는 단지 배당 어떠냐 필요 http://en.wikibooks.org/wiki/X86_Assembly/High-Level_Languages

+1

매우 유용합니다, tyvm! 내가 준비한 테스트 파일 용 Gdb (위 참조)가이를 확인하는 것으로 보인다. – gnometorule

관련 문제