2014-11-15 2 views
4

x86 mul 명령어를 통해 64 = 32x32 곱셈을 시도하지만 결과의 높은 dword (edx 레지스터) 만 필요합니다. 그래서 당연히 출력리스트로 edx을 나열하고 clobbered 레지스터로 eax을 시도했습니다.GCC asm에 입력 레지스터가 손상되었다고 어떻게 말합니까?

이것은 내게 자연스럽게 보이지만 입력 레지스터입니다. eax이 괴롭힘을 GCC에 알리려고하면 오류 메시지가 나타납니다.

__asm__("mull\t%2" : "=d"(div10) : "%a"(UINT32_C(0x1999999A)), "r"(number) 
    : "cc", "rax"); 

나는 그것을이 오류 메시지가 발생 것을 시도하는 경우

:

divmod10.cpp:76:91: error: can’t find a register in class ‘AREG’ while reloading 
‘asm’ 
divmod10.cpp:76:91: error: ‘asm’ operand has impossible constraints 

를 생략 컴파일하지만, 코드를 나누기. GCC가 잘못이다, 사방되지 eax에 의존 끝 :

 movl $429496730, %eax 
#APP 
# 76 "divmod10.cpp" 1 
     mull %esi 
# 0 "" 2 
#NO_APP 
     movl %edx, %esi 
#APP 
# 78 "divmod10.cpp" 1 
     mull %edx 
# 0 "" 2 
#NO_APP 

어떻게 내가 원하는 무엇을해야합니까?

+2

docs (https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html)에서 :'이 입력 값이 변경되고 있음을 컴파일러에 알리기 위해 클로버를 사용할 수 없습니다 .' '__asm ​​__ ("mull \ t % 2": "d"(div10), "= a"(정크) : "1"(UINT32_C (0x1999999A)), "r"(숫자) : "cc");'. –

답변

3

출력이 쓸데없는 임시 변통을 만들어 컴파일러가 최적화합니다. 예를 들면 다음과 같습니다.

__asm__("mull\t%2" : "=d"(div10), "=a"((int){0}) 
    : "a"(UINT32_C(0x1999999A)), "r"(number) : "cc"); 

이렇게 까다로운 입력을 처리하는 가장 쉬운 방법입니다.