Familia de instrucțiuni CMOVcc (Conditional Move) permite copierea unei valori dintr-un registru sau dintr-o locație de memorie într-un registru destinație doar dacă o condiție logică reflectată în registrul RFLAGS este adevărată.
Marele avantaj arhitectural al CMOVcc față de un salt condiționat tradițional (jcc) este eliminarea riscului de branch misprediction: procesorul nu mai trebuie să ghicească direcția saltului, evitând golirea pipeline-ului (pipeline flush), ceea ce optimizează dramatic buclele critice.
Calculul maximului a două numere fără instrucțiuni de salt
section .text
global max_doua_numere
; Funcție int64_t max_doua_numere(int64_t a, int64_t b)
; Argument 1: RDI = a
; Argument 2: RSI = b
; Valoare returnată în RAX
max_doua_numere:
mov rax, rdi ; Presupunem inițial că 'a' este maximul
cmp rsi, rdi ; Comparăm b cu a (rsi - rdi)
cmovg rax, rsi ; Dacă RSI > RDI (Greater, cu semn), RAX = RSI
ret ; Returnăm valoarea din RAX fără niciun salt jmp/jg!
| Instrucțiune | Condiție / Flag-uri | Semnificație (Semnat / Nesemnat) |
|---|---|---|
cmove / cmovz |
ZF = 1 |
Copiază dacă este Egal sau Zero. |
cmovne / cmovnz |
ZF = 0 |
Copiază dacă Nu este Egal (Not Zero). |
cmovg / cmovge |
ZF=0 și SF=OF / SF=OF |
Copiază dacă este Mai Mare (Greater) / Mai Mare sau Egal (numere cu semn). |
cmova / cmovae |
CF=0 și ZF=0 / CF=0 |
Copiază dacă este Deasupra (Above) / Deasupra sau Egal (numere fără semn). |
Întrebări & Exemple de Cod:
Transfer Condiționat fără Salturi: Instrucțiunile CMOVcc în x86_64Ai o nelămurire despre utilizarea comenzii
Transfer Condiționat fără Salturi: Instrucțiunile CMOVcc în x86_64sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.