2012-09-02 20 views
5

Sto usando MASM32.Porta bandiera in sostrato

Con questo codice: sarà impostato

mov eax,5 
sub eax,10 

CF flag di stato. Ma usando la mia matita e la carta, vedo che non c'è alcun trasporto da MSB. Sì, lo so dalla sottrazione di un numero minore di numeri grandi, CF. Ma voglio sapere perché?

Poiché utilizzando questo codice:

mov eax,5 
mov ebx,10 
not ebx 
add ebx,1 
add eax,ebx 

bandiera CF non viene mai impostato.

+0

È la programmazione 8086 o cosa? – nKandel

risposta

5
5 - 10 = 5 + (-10) = 0x05 + (0xF5 + 1) = 0x05 + 0xF6 = 0xFB 

    00000101 -- 0x05 
    11110101 -- 0xF5 
+ 00000001 -- 0x01 
========== 
    11111011 -- 0xFB 

E questo continua per 16 o 32 o 64 bit 0 + 1 + 0 = 1, portano 0

Hai ragione nel senso che pretende svolgere. Una sottrazione è un add con il secondo operando invertito e il carry in invertito. Alcune famiglie di processori invertono le operazioni da eseguire. Sembra che tu stia guardando qualcosa che inverte il prelievo su una sottrazione.

Quindi se 5 - 10 esegue (prendere in prestito), quindi provare 10 - 5 sullo stesso processore, non si dovrebbe vedere il bit di trasferimento impostato (nessun prestito).

Il secondo esempio è un'operazione di aggiunta, l'esecuzione non è invertita su alcun processore che io conosca, supportando ulteriormente il bit di trasporto come logica positiva che indica un prestito.

+1

Sicuramente tutti gli x86 agiscono allo stesso modo per quanto riguarda l'inversione del carry-out quando si sottrae? – harold

+0

giusto, è per questo che l'ho modificato per dire famiglia di processori. Quello che intendo è se si confronta il flag di carry tra x86, arm, avr, msp430, 6502, z80, ecc., Ecc., Alcuni inversione eseguono, altri no. All'interno di una famiglia o anche di un'azienda, mi aspetto che utilizzino la stessa soluzione. –

+1

oh ok, mancava quello – harold

1

In prima bandiera custodia è impostato perché si sottrae numero maggiore dal più piccolo one.In secondo caso Lets eax supponiamo è di 8 registro po 'poi

eax=00000101=05 
    ebx=00010000=10 
not ebx=11101111 
     +  1 
--------------------- 
     11110000 
     + 0101 
--------------------- 
     11110101 

Non troppo pieno è si verifica cioè è impostato alcun carry flag.

+2

l'hardware produce la stessa risposta addizione o sottrazione in base alla stessa logica utilizzata, la differenza è come viene gestito l'esecuzione per quel processore. sembra che questi invertitori della famiglia di processori (x86) eseguano (oltre al carry in e al secondo operando in) per una sottrazione ma nessuna inversione per un add. –