Diferența principală dintre test și CMP

Diferența principală dintre test și CMP

Ca urmare a PMC și a ansamblului de testare instrucțiuni modifică starea drapelului zero (ZF). Asta e tot ce au în comun! Este periculos să se presupună că aceste instrucțiuni sunt similare chiar și cu atât mai mult să spunem că ambele efectuează comparația. Sub tăiat - baza unei astfel de declarație îndrăzneață :)







Un punct important: steagul zero logic (ZF). Se ridică (egal cu unu) atunci când rezultatul operației este zero, adică toți biții rezultatului - zero.

cmp instrucțiuni (scurtă de comparare. - compara) compară două valori - memoria de registru, valoare imediată, - și seturi / resetează steagul ZF. În acest procesor, primind instrucțiuni cmp calculează diferența dintre valorile menționate anterior. Trebuie înțeles acum că dacă valorile sunt egale, rezultatul scădere este 0, deci minciuna flag zero (ZF = 1). exemplu:

Notă. cmp instrucțiuni diferă de sub corespunzătoare (Scădere - scădere) care afectează doar steagurile înregistrați.







instrucțiunile de testare. După ce a primit această comandă, procesorul efectuează operație AND (ȘI logic) cu doi operanzi. Ie Efectuează o multiplicare logică bitwise. În cazul în care logic și va reveni numai zerouri apoi a ridicat ZF pavilion. instrucțiuni de testare afectează, de asemenea, doar steagurile înregistra, în care diferă de și instrucțiuni. exemplu:

Concluzii. În primul rând, cmp și de testare afectează pavilion zero în sens invers. În al doilea rând, nu puteți utiliza comanda de test pentru a verifica valorile de egalitate! exemplu:

Comparăm aceleași numere / diferite, iar tranziția se efectuează în orice caz! Dacă în loc de testare a pus cmp, prima tranziție nu este executată. De ce un astfel de test ciudat? Bucurându-se de un număr record în SI binar:
5 (10) = 0101 (2)
4 (10) = 0100 (2)

Rezultatul instrucțiunile de testare:
test de 5,5: 0101 SI 0101 = 0101
test de 5,4: 0100 = 0101 SI 0100

Rezultatele ambelor operații sunt biți egale cu unu, deci steagul zero nu este înțeles. Acesta este motivul pentru care nu se poate baza pe o comparație a valorilor.

Deci, comanda de testare este utilizat pentru a verifica starea de steaguri biți, etc. Există o altă aplicație - verifica înregistrare zero valori:

test de EAX, EAX
jz someLabel, tranziția este executată doar dacă eax = 0

A explicat cât de mult a putut :) însuși nu a putut înțelege logica, mai ales având în vedere că testul și PMC - similare în scop comenzi. Din fericire, diferența este indicat în mod clar.