2009-08-12 2 views
4

In der Assembly Opcode cmovl, was wird verglichen? Zum Beispiel: EAX: 00000002 EBX: 00000001Was wird mit dem im cmovl-Opcode verglichen?

cmovl eax,ebx 

Was ist das Ergebnis? Welche muss weniger sein, damit sie bewegt werden können?

Vielen Dank!

Antwort

12

cmov keinen Vergleich macht, verwendet er das Ergebnis eines vorherigen Vergleichs - wenn es wahr ist, wird es die mov auszuführen. cmovl bedeutet „durchführen bewegen, wenn die vorherige Vergleich ergibt "kleiner als"

. Zum Beispiel:

cmp ecx, 5 
cmovl eax, ebx ; eax = ebx if ecx < 5 
+0

Vielen Dank! Sehr hilfreich und klar! – Ryan

4

Es sollte eine andere Anweisung vorangestellt werden, die Flags entsprechend setzt, wie cmp.

cmp ebx, ecx ; compare ebx to ecx and set flags. 
cmovl ebx, eax ; if (ebx < ecx (comparison based on flags)) ebx = eax 
2

cmovl den Umzug durchführen wird, wenn die Flag-Register hat die folgenden: SF!=OF

diese Flags würde als das Ergebnis einer vorherigen Operation gesetzt werden (typischerweise, aber nicht notwendigerweise, ein Vergleich irgendeiner Art).

Die cmovl Anweisung führt keinen eigenen Vergleich durch.

0

In AT & T Montag der entsprechende Code wäre:

cmp %ebx, %eax 
cmovl %ebx, %eax 

, die den Wert von %ebx zu %eax kopieren würden, wenn der in %eax gehaltenen Wert größer war als der in %ebx zum Zeitpunkt gehaltenen Wert von der Anruf cmp.

Mit Ihrem Beispiel Werten, wäre das Ergebnis, dass die bedingte Bewegung würde den Wert von %ebx zu %eax nicht kopieren, wie 0x02 deutlich größer als 0x01 ist.

Verwandte Themen