2016-11-20 5 views
1

Während ich die ganze 4-zeilige Stichprobe, die mir gegeben wurde, nicht auflisten sollte (da dies eine Hausaufgabenfrage ist) bin ich verwirrt, wie das gelesen und übersetzt werden soll C.x86-64 Assembly "cmovge" zu C code

cmovge %edi, %eax

Was ich bisher zu verstehen ist, dass der Befehl ein bedingter Umzug für wenn das Ergebnis> =. Es vergleicht den ersten Parameter einer Funktion %edi mit dem Ganzzahlregister %eax (dem in der vorherigen Zeile des Assemblercodes der andere Parameterwert %esi zugewiesen wurde). Ich verstehe sein Ergebnis jedoch nicht.

Mein Problem ist die Interpretation des optimierten Codes. Es manipuliert den Stapel nicht, und ich bin mir nicht sicher, wie man das in C schreibt (oder zumindest den gcc Schalter, den ich sogar verwenden könnte, um das gleiche Ergebnis beim Kompilieren zu erzeugen).

Könnte jemand bitte ein paar kleine Beispiele geben, wie die cmovge Anweisung in C-Code übersetzt werden könnte? Wenn es als eigene Codezeile keinen Sinn ergibt, können Sie sich etwas daraus machen.

Dies ist in x86-64 Assembly über ein virtualisiertes Linux-Betriebssystem (CentOS 7).

+0

Haben Sie die insn ref Handbuch lesen: HTML hier extrahieren: http: //www.felixcloutier .com/x86/CMOVcc.html. Weitere Links in [dem x86-Tag-Wiki] (http://stackoverflow.com/tags/x86/info). –

Antwort

2

ich Ihnen die ganze Lösung wahrscheinlich geben hier:

int doit(int a, int b) { return a >= b ? a : b; } Mit gcc -O3 -masm=intel wird:

doit: 
.LFB0: 
    .cfi_startproc 
    cmp edi, esi 
    mov eax, esi 
    cmovge eax, edi 
    ret 
    .cfi_endproc 
+0

Das macht jetzt viel mehr Sinn, danke! Und danke für den Schalter "-O3", das ist eine große Hilfe! –

+0

'a> = b? b: a; '? –

+2

@ Miharu461 (und Björn): vergiss nicht, dass Flaggen von allem kommen können. Der cmov Teil ist wirklich nur der 'eax = größer? edi: eax' part, wobei 'bool greas' durch irgendwas gesetzt werden kann, nicht unbedingt mit' a' oder 'b'. Also kann 'a = x> = y: b: a' immer noch zu einem cmovge kompilieren. –