Problema con readconsole

di il
15 risposte

Problema con readconsole

Salve a tutti
sto scrivendo una funzione che accetti una stringa da tastiera codice sottostante ma mi da il seguente errore : error LNK2019: riferimento al simbolo esterno _ReadConsole@20 non risolto nella funzione _kboard@12
.486
     .model flat,stdcall
       option casemap:none
     .data
          lsub dd ?
          khandle dd ?
          bufferk db 80 dup (?),0,0
          cletti dd ?
          standard dd ? 
          par1 dd ?
          par2 dd ?
          par3 dd ?
          pare dd 0
          errore db ?
     .code
                   extern cleareg@0:near
                   extern GetStdHandle@4:proc
                   extern ReadConsole@20:proc
                   cleareg EQU cleareg@0
                   prendihandle EQU GetStdHandle@4
                   leggi EQU ReadConsole@20
              kboard proc Arg1:dword,Arg2:dword,Arg3:dword
                a0000:
                       call cleareg
                       mov edx,Arg3
                       mov edi,Arg2
                       mov esi,Arg1
                       mov par1,esi
                       mov par2,edi
                       mov par3,edx
                       mov dword ptr standard,-10h ;STD_INPUT_HANDLE
                       mov esi,offset standard
		       push esi
                       call prendihandle
                       mov khandle,eax
                       mov esi,khandle
                       mov edi,offset bufferk
                       mov edx,par2
                       mov ecx,pare
                       mov ebx,offset cletti
                       push ecx
                       push ebx
                       push edx
                       push edi
                       push esi
                       call leggi
                       call cleareg
                       mov ebx,offset cletti
                       mov ecx,[ebx]
                       mov eax,ecx
                       mov esi,offset bufferk
                       mov edi,par1
                       rep movsb
                       ret 12
              kboard endp
    end
inoltre ho un dubbio sulla chiamata alla funzione prendihandle alias GetStdHandle
il dubbio e il seguente : io passo il valore tramite indirizzo non è che la funzione vuole una costante?
ringrazio anticipatamente chiunque mi dia una mano.

15 Risposte

  • Re: Problema con readconsole

    Quando posti del codice assembly devi sempre indicare in quale contesto operi ...

    E' un sorgente asm posto in un progetto c/c++ ? E' un singolo file compilato con masm?

    E soprattutto posta il main (o la funzione) da cui chiami il codice.
  • Re: Problema con readconsole

    Ok scusa pensavo che si capisse che era una funzione richiamata dal c++.
    allora il programma che richiama la funzione e il seguente:
    // keyboard.cpp : definisce il punto di ingresso dell'applicazione console.
    //
    #include "stdafx.h"
    #include "iostream"
    #include "window.h"
    using std::cin;
    using std::cout;
    using std::endl;
    extern "C" void __stdcall cleareg();
    extern "C" void __stdcall kboard(char*,int*,int*);
    int _tmain(int argc, _TCHAR* argv[])
    {
    char pippo[80];
    int leggi,errore;
    leggi=80; errore=0;
    kboard(pippo,&leggi,&errore);
    if (errore==0)
      {
        cout << "errore nella procedura kboard\n";
        return -1;
    }
    return 0;
    }
    
    so che nel listato assembler manca la modifica del parametro 2 e del parametro 3.
    quando correggo l'errore l'aggiungo.
    la funzione cleareg e composta da tutti
    xor reg,reg
    per tutti i registri escluso ebp,esp e i flag.
  • Re: Problema con readconsole

    smalldragon ha scritto:


    ok scusa pensavo che si capisse che era una funzione richiamata dal c++.
    Non è detto e comunque è importante che si veda anche il codice chiamante perché il problema potrebbe essere ovunque.

    Venendo al tuo problema la questione principale è che i nomi effettivi di molte API Windows che trattano stringhe sono diversi da quelli che si usano (che non sono altro che 'alias') e dipende dal tipo di stringhe usate (Ansi o Unicode). Nel caso di stringhe Ansi devi indicare il nome della API seguito da una A, ovvero

  • Re: Problema con readconsole

    Speriamo che facendo la modifica si risolva il problema.
    per quanto riguarda la cleareg sinceramente la trovo molto comoda in quanto preferisco avrere sempre un ambiente "pulito" conoscendo il valore iniziale e poi di solito uso tutti i registri standard che la procedura cancella.
    e pur vero che la uso un pò troppo spesso!
  • Re: Problema con readconsole

    smalldragon ha scritto:


    speriamo che facendo la modifica si risolva il problema.
    Prova e poi ne riparliamo
    per quanto riguarda la cleareg sinceramente la trovo molto comoda in quanto preferisco avrere sempre un ambiente "pulito"
    A mio parere, ripeto, non ha senso ...
  • Re: Problema con readconsole

    Si l'errore stava li nella readconsoleA
    ma quando eseguo il programma non mi consente di accettare i caratteri ed esce automaticamente.
    ma non esiste una funzione che emuli il vecchio int 16h mod ax,0 ?
    che era cosi comoda!
    se non dovesse esistere una funzione del genere quale tra le seguenti funzioni devo usare prima della readconsoleA ?
    GetConsolemodeA o SetConsoleModeA
  • Re: Problema con readconsole

    Tu sei fermo ancora al DOS ... non hai ancora compreso che quel sistema e quel modo di programmare è morto da secoli ...

    Tanto per cominciare, che tipo di programma stai scrivendo? Deve girare in Console o con una finestra Windows?

    Comunque, prova questo codice C per Console
    
    	INPUT_RECORD inrec;
    	DWORD mode, count;
    	int key;
    
    	HANDLE hstdin = GetStdHandle( STD_INPUT_HANDLE );
    		if (hstdin == INVALID_HANDLE_VALUE
    		|| !GetConsoleMode( hstdin, &mode )
    		|| !SetConsoleMode( hstdin, 0 ))
    		return 0;
    
    	FlushConsoleInputBuffer( hstdin );
    
    	do
    	{
    		do ReadConsoleInput( hstdin, &inrec, 1, &count );
    		while ((inrec.EventType != KEY_EVENT) || inrec.Event.KeyEvent.bKeyDown);
    
    		key=inrec.Event.KeyEvent.wVirtualKeyCode;
    		printf("%d ", key);
    	} while(key!=27);
    
    	SetConsoleMode( hstdin, mode );
    
    e vedi se ti può essere utile
  • Re: Problema con readconsole

    Già si peccato che l' hanno sepolta era cosi bella.
    adesso sembra che hanno complicato anche le cose più facili comunque pian piano mi adatterò.
    per il momento aggisco solo in console ma quando avrò appreso decentemente sia il c++ che questo nuovo assembler passerò alle finestre di windows alle gui per intenderci.
    al momento stò sviluppando una libreria e questa funzione mi servirà per sbarazzari della tanto scomoda cin e delle sue opzioni quali ad esempio getline clear etc etc
    magari aggiungendo anche la possibilità di intercettare i tasti comando quali ad esempio alt + lettera etc etc.
  • Re: Problema con readconsole

    smalldragon ha scritto:


    già si peccato che l' hanno sepolta era cosi bella.
    adesso sembra che hanno complicato anche le cose più facili comunque pian piano mi adatterò.
    Non mi pare che ci sia nulla di complicato .... è solo diverso, dato che i sistemi operativi (e anche le CPU!) si sono evoluti.
    per il momento aggisco solo in console ma quando avrò appreso decentemente sia il c++ che questo nuovo assembler passerò alle finestre di windows alle gui per intenderci.
    "nuovo assembler" ... non esiste ... è sempre lo stesso, solamente più evoluto. Se prima le CPU erano ad 8 bit ed adesso sono a 64 non pensi che debba cambiare anche tutto il resto? O ci teniamo le macchine di 20 anni fa?
    al momento stò sviluppando una libreria e questa funzione mi servirà per sbarazzari della tanto scomoda cin
    Non è affatto detto che si debba utilizzare cin per l'input ... in C/C++ puoi utilizzare un gran numero di funzioni per l'input ...

    La libreria di cui parli sarebbe meglio farla in C ...
    e delle sue opzioni quali ad esempio getline clear etc etc
    Sono "metodi" perché cin è un "oggetto" ... devi anche rassegnarti che esiste la programmazione ad oggetti ... (e da un bel po' ...)
    magari aggiungendo anche la possibilità di intercettare i tasti comando quali ad esempio alt + lettera etc etc.
    Quelle sono funzionalità di "basso livello" che un sistema operativo moderno deve limitare.
    Se vuoi fare tutto, scrivi un "driver a livello kernel" con cui puoi fare quello che vuoi (nei limiti del lecito) e comodamente in C.
  • Re: Problema con readconsole

    Beh le macchine di 20 anni fa proprio no avevano una grafica veramente da schifo e poi perchè altrimenti tra programmatori proggettisti e tutti gli addetti hai lavori del campo informatico la crisi economica sarebbe veramente oltre i confini di questa galassia!
    per quanto riguarda le prestazioni con i software che stanno oggi in giro, compreso sistema operativo, non è che poi abbiamo fatto tutto questo passo avanti.
    il dos andava in crash facilmente ma anche windows 7 e windows 8 non scherzano per quanto riguarda facilità di crash.
    ingorghi stavano nel config.sys con relativa lentezza del software e ingorghi ci sono oggi nel registro di sistema con relativa lentezza del software.
    una cosa c'era di bello che adesso difficilmente si trova ed è quando cancellavi i programmi questi venivano levati e non te li ritrovavi più fra i piedi.
    adesso invece quando disinstalli un programma viene levata solo una parte di solito quella che riguarda il registro di sistema e delle dll che molto spesso servono ad un altro programma che di conseguenza va in crash.
    quindi alla fine sei costretto a disinstallare anche l'altro e rimetterlo con conseguente riconfigurazione e rincoglionimenti vari per fargli rivedere i dati che giustamente non vedeva piu!o a fare il restore e rimetterti il programma che volevi levare. alla fine perdi una marea di tempo per fare un operazione che dovrebbe essere semplicissima!
    per non parlare poi che il programma comunque ti occupa spazio inutilmente sul hd che poi dovrai levare a mano o scaricarti una utility adatta per cancellare che oltre allo scopo prescelto a pure la “cortesia” di ingorgarti il registro di configurazione con il conseguente abbassamento delle prestazioni.
    quindi come vedi anche se oggi abbiamo cpu a 64 bit multicore molto spesso questi ultimi hanno prestazioni peggiori di un 486 al suo massimo splendore.
    son passati 20 anni per avere prestazioni simili!
    pero devo ammettere che il multitasking e la grafica sono vermente buone.
    Passando ad oltre perché l’argomento e molto lungo.
    dovresti sapere che se cambi metodologie e regole anche se la cosa esiste già diventa automaticamente nuova.
    e vero che oltre all'oggetto cin esistono una marea di altre funzioni quali ad esempio readconsole scanf(ereditata dal c) etc etc.
    le quali chi per un verso chi per un altro hanno spaventosi bug. che fanno diventare in molti casi la cin il male minore.
    conosco bene la programmazione ad oggetti e ti assicuro che nei 3/4 dei casi escludendo polimorfismo ed ereditarieta dell'oggetto.
    Metodi ed opzioni sono sinonimi.
    quella del driver a livello kernel e una ottima idea ma prima devo fare le funzioni a livello normale per testarle senza mandare in crash continuamente il pc.
    e poi devo migliorare le mie conoscenze di questo che per me è nuovo assembler.
    Perché limitarsi ad un drive livello kernel?
    Poi magari scrivo anche un sistema operativo però non credo di avere 200 anni a disposizione!
    Vorrei evitare l’uso massiccio del c o del c++, limitandomi alle primitive di base e alle funzioni di sistema, perché secondo me molti problemi di prestazione del software derivano dall’ uso sbagliato di molte funzioni che non si conosco nei minimi dettagli cioè punti di forza e punti deboli.
    Per questi ultimi in particolar modo la documentazione sulle funzioni non ti dice nulla o rara.
    Quindi visto che con primitive e funzioni di sistema non si può fare molto devo colmare con l’assembler. Pe primitive intendo gli include (stdafx.h, iostream, windows.h)
  • Re: Problema con readconsole

    Ascolta Vincenzo, secondo me scrivi "barlumi" di verità in un mare di "assurdità" avendo la pretesa di "insegnarci la verità dell'informatica ..." ... Ti assicuro che non è proprio così ...

    Io ho l'impressione (anzi quasi la certezza) che tu faccia una gran confusione tra tecnologie, software, argomentazioni che, molto probabilmente, non conosci a fondo (a volte per nulla).

    Quando parli di crash del DOS (che usava la CPU in modalità reale senza separazione degli spazi di indirizzamento) confondendoli con quelli dei moderni sistemi operativi (che lavorano in modalità protetta) e che sono "anni luce" lontani dai primitivi "sistemi operativi", dimostri di non conoscere molto (/nulla) dell'evoluzione hw/sw che c'è stata negli scorsi 20 anni nell'informatica.

    Tutta la questione dell'installazione/disinstallazione dei programmi è assurda e il fatto che dici di conoscere l'OOP e parli di "opzioni" (ma che intendi con opzioni poi) e "metodi" mi lascia veramente perplesso ...

    Scusa, non so se lavori nel campo o lo fai come hobby ... sicuramente non potresti fare questi discorsi nell'ambito del mondo IT perché questi non sarebbero sicuramente presi in seria considerazione.
  • Re: Problema con readconsole

    oregon ha scritto:


    Ascolta Vincenzo, secondo me scrivi "barlumi" di verità in un mare di "assurdità" avendo la pretesa di "insegnarci la verità dell'informatica ..." ... Ti assicuro che non è proprio così ...
    mi meraviglio di te che credi un fatto del genere!
    ho già insegnato informatica con ottimi risultati e sinceramente sono passato oltre prmotivi personali.
    quindi sinceramente io non ho mai preteso ne dimostrato di insegnare,su questo forum, le verità sull'informatica a chi e che sia!
    1) perchè se cosi fosse non mi sarei messo come un comune utente a cercare aiuto per qualche problema che ho tipo quello che ha scaturito questo form.
    2) quando rispondo a qualche form cerco semplicemente di far vedere più punti diversi del problema e se ho una o più idee di come si risolve un problema la esprimo liberamente e con la massima umiltà.
    sei tu che hai le pretese di insegnare le verità sull'informatica agli altri come tu stesso dici:

    oregon ha scritto:


    Io ho l'impressione (anzi quasi la certezza) che tu faccia una gran confusione tra tecnologie, software, argomentazioni che, molto probabilmente, non conosci a fondo (a volte per nulla).
    io non esprimo giudizi rispondo semplicemente a tono rispettando il punto di vista del mio interlocutore cosa che tu invece non sai fare.

    oregon ha scritto:


    Quando parli di crash del DOS (che usava la CPU in modalità reale senza separazione degli spazi di indirizzamento) confondendoli con quelli dei moderni sistemi operativi (che lavorano in modalità protetta) e che sono "anni luce" lontani dai primitivi "sistemi operativi", dimostri di non conoscere molto (/nulla) dell'evoluzione hw/sw che c'è stata negli scorsi 20 anni nell'informatica.
    scusami se non hai capito cosa volessi dire ma ti facevo più perspicace!
    si conosco benissimo i progressi che si sono succeduti ho continuato a lavorare nel campo informatico non sono stato in vacanza su marte come potresti chedere tu!
    visto che tu sei portato a farti i giudizzi su gli altri come dimostri.
    volevo semlicemente dire che nonostante fossero trascorsi 20 anni i sistemi operativi continuavano adandare in crash co la stessa faciltà.

    Tutta la questione dell'installazione/disinstallazione dei programmi è assurda
    noto che sei stato fortunato e che non hai fatto molta assistenza tecnica altrimente te ne saresti accorto della problematica e magari ti saresti fatto anche una idea sul come risolvere il problema.
    cosa che invece non conscendo ti sembra assurda.
    il fatto che dici di conoscere l'OOP e parli di "opzioni" (ma che intendi con opzioni poi) e "metodi" mi lascia veramente perplesso ...
    2 curiosità
    1) da quanto tempo aiil programmatore?
    2) di solito quando programmi usi genertori?

    smalldragon ha scritto:


    Scusa, non so se lavori nel campo o lo fai come hobby ... sicuramente non potresti fare questi discorsi nell'ambito del mondo IT perché questi non sarebbero sicuramente presi in seria considerazione
    ci lavoro nel campo informatico e conosco abbastanza bene i discorsi che si possono fare nel ambito e ti assicuro che oltre i 2/5 di chi ci lavora sviluppa software utilizzando generatori.
    e questo ti dovrebbe far ben capire che discorsi tipo il mio come possono essere presi!
    p.s.
    scusami per gli errori di ortografia e grammatica ma non sono un granchè a scrivere in italiano forse e per questo che io e te non riusciamo quasi mai a capirci.
  • Re: Problema con readconsole

    Generatori ? In tutta la mia carriera di insegnante/programmatore/sistemista non ho mai usato "generatori" di codice. Ma che c'entrano poi i generatori di codice nel discorso che stiamo facendo??

    I 2/5 ?? (Perché non un 40% ?) Da dove la prendi questa percentuale? Da quali statistiche? Non mi dirai che conosci il 100% dei programmatori e sai come lavorano ... ma dai !

    Quello che scrivi non ha senso ... Ecco perché non ci capiamo, gli errori di ortografia non c'entrano nulla.

    Va beh ... lasciamo perdere ... non te la prendere, nessun "giudizio" su te come persona, non avrebbe senso e non mi permetterei, ma su quello che dici/scrivi sull'informatica si potrà pure discutere in un forum, o no? E quello che scrivi sull'informatica non lo condivido, tutto qui.

    (Basta una frase : per quanto riguarda le prestazioni con i software che stanno oggi in giro, compreso sistema operativo, non è che poi abbiamo fatto tutto questo passo avanti. ... Ma tu hai mai usato un CAD ?)
  • Re: Problema con readconsole

    Sono daccordo con te sul non dare nessun giudizio.
    di programmatori ne conosco parecchi sia di ditte italiani che di ditte americane, specie nel gestionale, ed ecco perchè affermo la parcentuale che ho ho detto.
    per quanto riguarda i cad si li uso,per passione non per lavoro, e sono molto potenti ed utili ma io quando parlavo di crash mi riferivo hai sistemi operativi.
    mi sono riferito hai programmi applicativi solo per quanto riguarda l'istallazione e la disinstallazione.
    ma non mi sarei mai azzardato a dire che i programmi applicativi sono inferiori a quelli di 20 anni fa cosa che sarebbe assurda!
    al massimo avrei detto che hanno una facilità simile di andare in crash.
    buona giornata e finiamola qui le polemiche non mi piacciono tanto nessuno dei due cambia idea.
Devi accedere o registrarti per scrivere nel forum
15 risposte