2009-04-27 9 views
23

È noto che CF indica l'esecuzione non firmata e OF indica overflow firmato. Quindi, come fa un programma di assemblaggio a distinguere tra i dati non firmati e quelli firmati poiché è solo una sequenza di bit? (Tramite memoria aggiuntiva per informazioni sul tipo, o tramite informazioni sulla posizione o altro?) E queste due bandiere potrebbero essere utilizzate in modo intercambiabile?sull'assemblaggio CF (Carry) e OF (Overflow) flag

risposta

32

La distinzione riguarda le istruzioni utilizzate per manipolare i dati, non i dati stessi. I computer moderni (dal 1970 circa) usano una rappresentazione di dati interi chiamati complementi a due in cui addizioni e sottrazioni funzionano esattamente allo stesso modo su entrambi i numeri con segno e senza segno.

  • La differenza di rappresentazione è l'interpretazione data al bit più significativo (chiamato anche il bit segno). Per i numeri non firmati quel bit indica un numero positivo molto grande; per i numeri firmati significa un numero negativo molto grande (numero negativo con un grande valore assoluto).

  • Diverse istruzioni possono utilizzare diverse interpretazioni dello stesso bit. Ad esempio, la maggior parte delle macchine di grandi dimensioni ha istruzioni di moltiplicazione firmate e non firmate. Le macchine con un'istruzione "imposta meno di" possono avere aromi firmati e non firmati.

  • Il simbolo OF (indicatore di overflow) indica se un carry ha invertito il segno del bit più significativo nel risultato in modo che sia diverso dai bit più significativi degli argomenti. Se i numeri vengono interpretati come non firmati, il flag di overflow è irrilevante, ma se sono interpretati come siglati, i mezzi OF, ad es., Sono stati aggiunti due numeri positivi grandi e il risultato è stato negativo.

  • Il flag CF (trasporta) indica se è stato eseguito un bit della parola interamente (ad esempio nel bit 33 o nel bit 65). Se i numeri vengono interpretati come non firmati, il flag di carry indica che l'aggiunta è overflow e il risultato è troppo grande per rientrare in una parola macchina. Il flag di overflow è irrilevante.

La risposta alla tua domanda è che il codice assembly ha diversi modi di distinguere firmato dai dati senza segno:

  • Si può scegliere CF o OF da fare firmato o confronti non firmati.
  • Può scegliere di moltiplicare o annullare le istruzioni con segno o senza segno.
  • Può scegliere uno spostamento a destra con segno o senza segno (le copie firmate vengono copiate in alto, gli spostamenti senza segno negli zeri).
+0

in modo che "in entrambi i casi è possibile", ma il codice assembly sceglie quello più "significativo" (quello ha senso)? – Pwn

+7

Per i numeri firmati, il bit più significativo NON significa "ampio negativo", solo "negativo". – MarcH

+0

Dovremmo notare che CF può anche essere usato come [Borrow Bit] (http://en.wikipedia.org/wiki/Carry_flag) – Tony

-3

Credo che sia basato sull'operazione che si sta utilizzando che determina quale flag utilizzare. Per esempio. firmato vs non firmato add. Quindi suppongo che tu possa giocare con la memoria con qualsiasi comando tu desideri.

1

Di solito i programmi di assemblaggio non contengono informazioni speciali con variabili per indicare se sono firmati o non firmati. È compito del programmatore sapere quando controllare quali flag e quando utilizzare i condizionali (ad esempio usando JA anziché JG).

Quindi è necessario sapere quale tipo di variabile si sta per lavorare in modo da sapere quali comandi utilizzare. Questo è il motivo per cui la maggior parte dei linguaggi di programmazione fornisce avvertimenti quando i programmatori usano i tipi di firma/non firmato in modo intercambiabile (cioè senza un cast esplicito), poiché ciò può essere fatto nell'hardware ma può produrre risultati imprevisti.

4

Non funziona. Le bandiere si impostano appena si verifica la condizione. Il programmatore dovrebbe sapere con quali tipi di intelli sta lavorando e da che sa quale bandiera esaminare se gliene importa.

5

Esistono diversi codici opzionali per gestire i dati con segno e senza segno. Se un programma vuole confrontare due interi con segno, utilizza i codici operativi jl, jle, jg, e jge, dove L e g rappresentano l ess e g reater rispettivamente. Se un programma vuole confrontare due interi senza segno, utilizza i codici operativi jb, jbe, ja, e jae, dove la A e B supporto per un Bove e b elow rispettivamente. La e sta per 'o uguale a' in tutti i casi. Questi opcode sono utilizzati per la ramificazione in base a un confronto.

Analogamente, vi sono anche le istruzioni setCC, che impostano un byte su 0 o 1 a seconda del confronto. Questi funzionano identicamente - ci sono setl, setle, setg, setge, setb, setbe, seta, setae e altri.

Gli opcode firmati verificano i flag ZF, OF e SF. Gli opcode senza segno testano i flag ZF, CF e SF. Vedere le sezioni del Manuale di riferimento del programmatore 80386 sulle istruzioni JCC e le istruzioni setCC per le condizioni esatte testate.

3

Non c'è modo di chiedere alla CPU di testare e restituire il tipo di un byte/parola/lungo.

0xFF può contenere "255" o "-1" tutto dipende dal tipo di byte indicato dal programma.

Costrutti come "tipo", "signess" ecc. Esistono solo in linguaggi di livello superiore come Java e non a livello di CPU. Alla fine tutto è un byte per la CPU, è compito dei nostri programmi organizzare e sapere come interpretare e manipolare questi valori ...

I flag CPU trovati nello stato non applicano alcun paradigma. il tuo codice per testare e reagire di conseguenza.

Nelle CPU Intel i registri MMX e FPU occupano effettivamente gli stessi registri. È quindi impossibile combinare le istruzioni di tipo FPU e MMX contemporaneamente, poiché i valori di una operazione cancellano l'altro. I programmi che in genere devono completare le loro azioni in un'unica modalità, ad esempio emettere le istruzioni della FPU e quindi avviare MMX, ma mai entrambi contemporaneamente.

16

Non tentare di opcode il segno. Questo è impossibile. Invece, cerca solo di realizzare la verità: non c'è nessun segno. Quindi vedrai che non è il tipo di segno che differenzia, è solo te stesso.

Problemi correlati