Alcune di queste sono state trattate, ma inserirò un po 'più in dettaglio.
Lo scopo generale dell'istruzione test reg,mask
verifica un valore di registro rispetto a una maschera (il valore di registro è internamente ad AND con maschera) e quindi imposta i flag di stato SF, ZF e PF in base al risultato. [EDIT per commento da @ChrisDodd] Si elimina inoltre incondizionatamente la O
(overflow) e C
stato (carry) bit. [/ EDIT]
SF = sign flag (1 if sign bit is set (a 2's complement negative value))
ZF = zero flag (1 if result is 0)
PF = parity flag (1 if result has an even number of 1 bits)
In questo esempio specifico (test eax,eax
), l'istruzione sta prendendo eax AND eax
. Quando questo è fatto, i bit saranno:
SF = 1 if EAX has a negative value (since sign bit will not change when ANDed with itself)
ZF = 1 if EAX is zero (the only value that yields a zero when ANDed with itself is zero)
PF = 1 if EAX has an even number of 1 bits
In altre parole, è un semplice test per zero o negativo. È un modello molto comune nella generazione del codice del compilatore.
possibile duplicato di [x86 Assembly - 'testl' eax contro eax?] (Http://stackoverflow.com/questions/147173/x86-assembly-testl-eax-against-eax) – interjay
Non ci credo, sta usando un'istruzione di salto diversa. – dgamma3
È ancora un confronto con 0, è possibile utilizzare qualsiasi istruzione di salto dopo di esso. – interjay