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
어떻게 내가 원하는 무엇을해야합니까?
docs (https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html)에서 :'이 입력 값이 변경되고 있음을 컴파일러에 알리기 위해 클로버를 사용할 수 없습니다 .' '__asm __ ("mull \ t % 2": "d"(div10), "= a"(정크) : "1"(UINT32_C (0x1999999A)), "r"(숫자) : "cc");'. –