Ho visto il codice successivo:Assemblaggio - istruzione shr attivare la funzione carry flag?
shr AL, 1
jnc bit_0
Non capisco quando il carry flag si accende a causa di SHR instrucrion?
Grazie
Ho visto il codice successivo:Assemblaggio - istruzione shr attivare la funzione carry flag?
shr AL, 1
jnc bit_0
Non capisco quando il carry flag si accende a causa di SHR instrucrion?
Grazie
Non funziona; fa lo scr (shift con carry). Tuttavia, il test potrebbe essere inteso per (e lo fa) verificare come è stato impostato il bit di carry PRIMA che lo shr sia stato eseguito.
Sei sicuro? Il mio libro fornisce il prossimo esempio: Prima del turno: AL = 10101110 ; shr AL, 1 ; Dopo il turno: 01011100, CF = 1 ; È un errore? –
Fonte: http://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate Inoltre, se così fosse, quale sarebbe il punto di fare scr? –
Non c'è 'scr'. 'shr' e' shl' si spostano nel bit di carry. Fonte: http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-2b-manual.pdf – ughoavgfhw
shr AL, 1
sposta tutti i bit in AL
esattamente in un punto.
Il bit originale più a destra viene spostato fuori dal registro AL
nel flag di trasporto (e il nuovo bit più a sinistra è impostato su 0). Per esempio:
+------------------------+ +------------------------+
| 1 0 0 1 0 1 0 1 | | 0 1 1 0 0 1 0 0 |
+------------------------+ +------------------------+
\ \ \ \ \ \ \ \ or \ \ \ \ \ \ \ \
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
+------------------------+ CF +------------------------+ CF
|(0) 1 0 0 1 0 1 0 | 1 |(0) 0 1 1 0 0 1 0 | 0
+------------------------+ +------------------------+
nel tuo commento su un'altra risposta:
Il mio libro dà l'esempio successivo: Prima di turno: AL = 10.101.110; shr AL, 1; Dopo il turno: 01011100, CF = 1; È un errore?
Se è quello che dice, allora sì. Questo è uno spostamento a sinistra (shl AL, 1
), non uno spostamento a destra: i bit di AL
sono stati spostati a sinistra di un posto e il flag di trasporto è stato impostato sul bit che è stato spostato dall'estremità sinistra.
per aggiungere alcuni chiarimenti:
shr AL, 1; esso (SH) ift (R) ight (1) x il valore contenuto nel registro AL, che è 8 byte inferiori del registro AX. Quindi dividerà per 2 il valore contenuto in AL.
Se AL era precedentemente uguale a 0b100 (4), diventerà 0b10 (2) e metterà 0 nel flag di trasporto. Il flag di trasporto è il bit 0 nel registro flag https://en.wikipedia.org/wiki/FLAGS_register
Se AL era precedentemente un valore dispari come 0b101 (5), diventa 0b10 (2) e inserisce 1 nel registro flag. Quindi il flag carry si comporta come un resto se dividi per 2.
jnc bit_0; Sarà (J) ump per etichettare 'bit_0' se è stato impostato il flag di (N) o (C) arry, cioè se il valore era pari (come 0b100 nell'esempio precedente) prima dello spostamento.
Sta testando se AL è pari o dispari. – harold