Wie teile ich GCC asm mit, dass ein Eingaberegister überfüllt ist?

Ich versuche eine 64 = 32x32 Multiplikation über das x86 @ zu machmul Anweisung, aber ich brauche nur das hohe Wort des Ergebnisses (dasedx registrieren). Also habe ich natürlich versucht Listingedx als Ausgangsregister undeax als überladenes Register.

Das scheint mir natürlich, abereax istebenfall ein Eingaberegister. Wenn ich versuche, GCC zu sagen, dasseax ist verstopft, es wird eine Fehlermeldung ausgegeben.

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

Wenn ich das versuche, wird diese Fehlermeldung ausgegeben:

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

Lassen es kompiliert, aber bricht den Code. GCC verlässt sich letztendlich aufeax wird nicht überladen, was falsch ist:

        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

Wie mache ich was ich will?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage