la questione carry flag!
-
04-10-2019 - |
Domanda
AX Supponiamo = FFFE e BX = 1234
ora se scriviamo cmp ax,bx
(BX sarà sottratto dal ascia e le flages viaapproprite sarà aggiornato)
Ora la rappresentazione binaria dei numeri in ax e bx è dato da
AX = 1111 1111 1111 1110
BX= 0001 0010 0011 0100
Come BX sarà sottratto dal ascia quindi dobbiamo negate bx (come Risultato = ax + (- bx))
in modo che il BX negato (complemento di BX a 2) è data da.
BX= 1110 1101 1100 1100
Ora aggiungiamo sia ascia e bx (come la sottrazione è implementato con l'aggiunta di computer)
AX= 1111 1111 1111 1110
BX= 1110 1101 1100 1100
------------------------------------
1 1110 1101 1100 1010
Ora, come si può vedere il risultato è di 17 bit ora il bit 17 dovrebbe andare in carry Flage, ma quando ho controllato il carry flag è 0 che è CF = 0 perché?
Soluzione
Trovato un link qui: http://oopweb.com/Assembly/Documents/ArtOfAssembly/ Volume / Chapter_6 / CH06-2.html
E 'come mi aspettavo. Il carry flag viene impostato solo se era necessario "prendere in prestito". Nel fare la sottrazione, si imposta il carry flag prima di fare il "sottrarre" e il nuovo flag di carry dice se si dovesse prendere in prestito. Il vostro esempio omessa l'aggiunta di 1 per la bandiera prefissato riporto nel bit 17 che causerà alcun riporto nel risultato.
Altri suggerimenti
Pensate al carry flag come un po 'prendere in prestito quando viene eseguita la sottrazione. Questo viene inizializzato a 1 in modo che il funzionamento è a−b−C
, cioè a + not(b) + C
anziché a + not(b) + 1
come avete descritto. In altre parole, il riporto è invertita per sottrarre in modo che possa essere usato per fare sottrarre precisione multipla.