2012-03-22 10 views

risposta

0

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.

+1

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? –

+1

Fonte: http://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate Inoltre, se così fosse, quale sarebbe il punto di fare scr? –

+3

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

9

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.

0

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.

Problemi correlati