È 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
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).
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.
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.
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.
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.
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.
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.
- 1. Flag di overflow e carry su Z80
- 2. Assemblaggio - istruzione shr attivare la funzione carry flag?
- 3. Qual è il comportamento del flag di carry per CP su un Game Boy?
- 4. Perché cmp 0x84,0x30 attiva il flag di overflow?
- 5. esempio di overflow del buffer dal libro Art of Exploitation
- 6. CF - QoQ vs Query
- 7. Flag di file NLog e keepFileOpen flag
- 8. Istruzioni di montaggio per l'impostazione, cancellazione di flag OF e TF
- 9. Oggetti CF vs oggetti NS
- 10. Assembly ADC (Aggiungi con carry) a C++
- 11. Visual C++ x64 add con carry
- 12. Errori gravi e intermittenti con il servizio Web CF
- 13. Combinazione di flag -v e -A flag in grep
- 14. InvokeRequired of Form == false e InvokeRequired of contained control == true
- 15. Overflow-y: auto e overflow-x: visibili nello stesso tempo?
- 16. bitwise controllare se flag flag
- 17. Array of struct e sizeof
- 18. breakout of if e foreach
- 19. onApplicationEnd - CF in realtà si sta spegnendo?
- 20. Overflow intero e comportamento indefinito
- 21. Stack overflow alla riga 0
- 22. modifica comportamento overflow CSS overflow
- 23. È possibile accedere al registro flag di overflow in una CPU con C++?
- 24. Bypassare un overflow addizione senza segno rilevata dal CBMC
- 25. Java Permutazione e combinazione dei flag booleani
- 26. Calcolo del bit di flag e rilevamento
- 27. Nessun flag O_BINARY e O_TEXT in Linux?
- 28. "If" statement - Order of validation of objects?
- 29. target_compile_definitions con più flag
- 30. Overflow contenuto automatico all'interno di overflow nascosto?
in modo che "in entrambi i casi è possibile", ma il codice assembly sceglie quello più "significativo" (quello ha senso)? – Pwn
Per i numeri firmati, il bit più significativo NON significa "ampio negativo", solo "negativo". – MarcH
Dovremmo notare che CF può anche essere usato come [Borrow Bit] (http://en.wikipedia.org/wiki/Carry_flag) – Tony