Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C++] Scrivere sulla console senza cout

    che cosa è sbagliato in questo codice?
    codice:
    unsigned char *p = (unsigned char *)0xB8000;
    for (int i=0; i<=3999; i++, p++)
     if (i%2==0)
       *p = 'E';
     else 
       *p = (2 + (4 << 3 ));
    visto che so che la memoria video in modalita testo-colore 80x25 risiede negli intervalli 0xb8000..0xb8000+2*80*25, e visto che è così mappata:
    0xb8000 ASCII_CARATTEREINPOSIZIONE(0,0)
    0xb8001 COLOREDI_CARATTEREINPOSIZIONE(0,0)
    0xb8002 ASCII_CARATTEREINPOSIZIONE(1,0)
    0xb8003 COLOREDI_CARATTEREINPOSIZIONE(1,0)
    0xb8004 ASCII_CARATTEREINPOSIZIONE(2,0)
    0xb8005 COLOREDI_CARATTEREINPOSIZIONE(2,0)

    il mio codice dovrebbe funzionare, ma l'applicazione crasha... perchè??

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,318
    Credo che il problema si presenti perchè l'are di memoria che stai andando ad indirizzare non è disponibile perchè riservata al sistema operativo. In pratica il sistema operativo la segna come riservata.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    posso in qualche modo disabilitarlo allora?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,318
    Uhm... non che io sappia...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    nessuno sa dirmi come si può fare?? o se c'è un metodo alternativo?

    Perchè io col turbopascal7 già l'ho fatto, e ora non riesco a provarlo in c++. in pascal usavo
    for i:=0 to 3999 do
    mem[$B800:i] := ...;

  6. #6
    Originariamente inviato da gygabyte017
    nessuno sa dirmi come si può fare?? o se c'è un metodo alternativo?
    Le API (MSDN)
    Perchè io col turbopascal7 già l'ho fatto, e ora non riesco a provarlo in c++. in pascal usavo
    for i:=0 to 3999 do
    mem[$B800:i] := ...;
    Col turbopascal7, in ambiente WinNT-WinXP ?
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Chiariamo un fatto, che forse e' alla base del tuo problema ...

    Se programmi con strumenti Win32 (a 32 bit insomma), gli indirizzi sono virtuali e non fisici. Quindi l'indirizzo 0xB8000 non fara' affatto riferimento alla memoria video ma sara' un qualsiasi indirizzo del tuo processo. E' probabile che questo indirizzo non sia assegnato al tuo processo da cui l'errore.

    Se lavori con strumenti a 16 bit (MSDOS), allora gli indirizzi sono nel formato Segmento:Offset e gestiti da Windows in maniera opportuna per adattarsi alla vecchia modalita'.

  8. #8
    Originariamente inviato da oregon
    Chiariamo un fatto, che forse e' alla base del tuo problema ...

    Se programmi con strumenti Win32 (a 32 bit insomma), gli indirizzi sono virtuali e non fisici. Quindi l'indirizzo 0xB8000 non fara' affatto riferimento alla memoria video ma sara' un qualsiasi indirizzo del tuo processo. E' probabile che questo indirizzo non sia assegnato al tuo processo da cui l'errore.

    Se lavori con strumenti a 16 bit (MSDOS), allora gli indirizzi sono nel formato Segmento:Offset e gestiti da Windows in maniera opportuna per adattarsi alla vecchia modalita'.
    esatto, hai indovinato.
    In effetti col turbopascal7 facevo applicazioni dos a 16bit, e quindi [B800:0] funzionava...
    In c++ invece è 32bit, quindi ora capisco perchè non funziona. E come posso fare a ottenere l'indirizzo fisico 0xB8000 ??

    Grazie

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da gygabyte017
    esatto, hai indovinato.
    In effetti col turbopascal7 facevo applicazioni dos a 16bit, e quindi [B800:0] funzionava...
    In c++ invece è 32bit, quindi ora capisco perchè non funziona. E come posso fare a ottenere l'indirizzo fisico 0xB8000 ??

    Grazie
    Mi fa piacere di avere indovinato ...

    A 32 bit, diciamo cosi', e' cambiato tutto ... l'unico che puo' accedere alla memoria fisica (come ad altri device fisici) e' solamente il sistema operativo, oppure il codice che gira in un device driver in modalita' kernel.

    Ma soprattutto, non e' detto che la memoria video, nei moderni sistemi, stia in quella posizione. Le console DOS "simulano" la presenza di memoria video a quell'indirizzo e poi vanno ad interfacciarsi al driver video al quale inviano le opportune istruzioni per visualizzare i dati ...

    Insomma ... o continui con strumenti a 16 bit (e passi attraverso la simulazione del DOS) oppure scrivi un device driver a 32 bit.
    L'alternativa e' (come ti hanno consigliato) passare attraverso le API di gestione della Console che permettono la "simulazione" di cui ti dicevo. Ma NON puoi scrivere direttamente con un puntatore nella memoria video.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.