2011-11-07 3 views
6

Ho letto e con il set di istruzioni 8086, si dice che un CMP (confronta) può impostare la bandierina. Capisco che un confronto sottrae due operandi ma mi stavo chiedendo se qualcuno può fornire un esempio quando questo è il caso.Perché CMP (confronta) a volte imposta un flag di trascinamento nell'assieme 8086?

Non riesco proprio a cogliere l'idea di aggiungere un numero e un numero negativo imposterà il flag di trasporto. Ho letto la bandiera del prestito, ma ho solo bisogno di un esempio per chiarire la mia comprensione di un'istruzione comparativa.

Inoltre, ho capito che se 3 - 5 = -2 impostarebbe il flag negativo ... quando è carry set?

+0

L'affermazione "Devo fare un esempio" rende questo suono come un compito a casa. Se esegui il debug di un codice esistente e guardi la bandiera CY, sono sicuro che la vedrai impostata dopo alcune istruzioni ADD. –

+0

Beh, sto creando la mia propria Instruction Set Architecture e sto solo leggendo le istruzioni 8086 e mi chiedo come un confronto (che sottrae 2 operandi e imposta i rispettivi flag) possa impostare il flag di carry.So quando l'ADD imposta il carry, ma sono un po 'scettico sul sottrarre/trasportare (da non confondere con il prestito). – faul

+0

sull'8086 (e molti altri), il flag di trasporto svolge il doppio lavoro e rappresenta il prestito in operazioni di sottrazione o confronto. Se esegui un confronto in cui il valore che viene confrontato è maggiore di quello che è presente nel registro, c'è un prestito, ad es. Viene impostato il flag CY. Se il valore è uguale o inferiore al registro, non vi è alcun prestito e CY viene cancellato. – JustJeff

risposta

4
  • Il flag di trasporto viene impostato dopo un'operazione che ha provocato un underflow o un overflow. Ad esempio, sottraendo 10 da 6 si otterrà un underflow e si imposterà il flag di carry. Allo stesso modo, l'aggiunta di 1 al valore massimo del registro comporterà un overflow e imposterà il flag di carry.
  • Il flag di trasporto viene modificato anche durante un'operazione di cambio, viene impostato sul valore dell'ultimo bit spostato fuori dal registro di destinazione.
  • Il test del bit inserirà il valore del bit testato nel flag di trasporto . Opcode che fanno questo: BT, BTC, BTR e BTS.
  • Istruzioni che influiscono direttamente sul contrassegno di trasporto: CLC, CMC e STC.
  • Durante un confronto, il flag di trasporto viene impostato come se i due operandi fossero stati sottratti.
  • Durante una negazione (NEG), il flag di trasporto viene impostato a meno che l'operando sia zero, nel qual caso viene cancellato.
2

Il flag di trasporto viene normalmente impostato quando si utilizza l'aritmetica senza segno. Ad esempio, l'aggiunta di due numeri non firmati (il cui risultato non rientra nel registro) non aumenterebbe il flag di overflow ma porterebbe solo il flag. Tuttavia, quando si utilizza l'aritmetica firmata, il flag di overflow viene impostato in tale evento.

1

È possibile trovare esempi di quando i flag di trasporto e di overflow sono impostati su 0 e 1 dopo l'aggiunta o la sottrazione di numeri interi in this answer a una domanda correlata.
È inoltre possibile trovare codice di esempio C che emula l'add con carry e sottrarre con istruzioni di prestito per numeri a 8 bit e si può giocare con quello, magari ottenere più esempi.

Il formato di uscita c'è qualcosa di simile:
127(127) - 255( -1) - 1 = 127(127) CY=1 OV=0
dove ogni numero viene rappresentato come sia senza segno e tra parentesi firmato (complemento a 2) accanto ad essa. Il numero precedente a = è il flag di trasporto prima di ADC/SBB. CY= e OV= mostrano i flag di trasporto e di overflow dopo ADC/SBB.

Confronta fa praticamente la stessa cosa di sottrarre senza prendere in prestito, tranne che influenza solo il carry, l'overflow, il segno e lo zero (e la parità e il trasporto ausiliario, ma non sono importanti qui) senza modificare alcun numero in un registro /memoria.