Transfer Condiționat fără Salturi: Instrucțiunile CMOVcc în x86_64 în Assembly (x86_64)

Ghid complet pentru instrucțiunile de transfer condiționat CMOVcc în x86_64: cmove, cmovne, cmovg, cmovl și eliminarea penalizărilor de branch misprediction în pipeline-ul CPU.

Sintaxă
cmp rax, rbx; cmovg rax, rbx ; copiază dacă rax > rbx

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).
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: Transfer Condiționat fără Salturi: Instrucțiunile CMOVcc în x86_64

Ai o nelămurire despre utilizarea comenzii Transfer Condiționat fără Salturi: Instrucțiunile CMOVcc în x86_64 sau 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.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.