|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Oct 2014
Messaggi: 7
|
[C & ASSEMBLY] Problema con la stampa stringa
Ciao, spero possiate aiutarmi con il mio problema.
Volevo provare a stampare una stringa da un programma che gira senza sistema operativo. codice: Codice:
__asm__(".code16;"); __asm__("jmpl $0x0000, $main;"); void printchar(const char var){ __asm__ __volatile__ ("int $0x10" : : "a"(0x0e00 | var), "b"(0x0007)); } void print(char* stringa){ char* var=stringa; while(*var != '\0'){ printchar(*var); ++var; } } void main() { print("ciao"); } Spero possiate aiutarmi, grazie in anticipo. PS: Il compilatore è GCC sotto ubuntu |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2014
Messaggi: 1368
|
Vado mooolto a memoria perchè è passata davvero una vita da quando mi piaceva fare esperimenti con gli interrupt e la memoria video.
![]() All'interno dell'interrupt 10 ci sono due servizi che puoi usare: uno per leggere e l'altro per cambiare la posizione del cursore. Penso che tu debba usarli per modificare esplicitamente la posizione prima di scrivere il carattere successivo |
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Oct 2014
Messaggi: 7
|
Grazie per la risposta.
Ho fatto diversi test cambiando cose qua e la all'interno del codice in c e ho notato che se la stringa da stampare é passata dalla funzione allora stampa "S", ma se la stringa all'interno della funzione print é statica allora stamperà la stringa data . ad esempio Codice:
void print(){ char* str="prova"; while(*str != '\0'){ ........ } } Altrimenti se la funzione é generica Codice:
void print(char* str){ while(*str != '\0'){ ........ } } Sto impazzendo ![]() |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: May 2014
Messaggi: 1368
|
Si, ti sei spiegato. Hai provato a vedere se nelle varie funzioni la stringa è quella corretta?
Nel main infatti tu dichiari la stringa che vuoi stampare ma Hai verificato che all'interno della funzione print il parametro passato sia uguale alla stringa corretta e che abbia il terminatore? Se in quella funzione è tutto ok, poi verifica che i caratteri passati volta per volta alla printchar siano quelli giusti. |
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Oct 2014
Messaggi: 7
|
Codice:
__asm__(".code16\n"); __asm__("jmpl $0x0000, $main\n"); void printch(char v){ __asm__ __volatile__ ("int $0x10" : : "a"(0x0e00 | v), "b"(0x0007)); } void print(char* vari){ char* pro="AAAA"; if(vari==pro){ printch('T'); }else{ printch('F'); } while(*vari!='\0'){ if(*vari=='A'){ printch('A'); }else{ printch('B'); } ++vari; } } void main() { print("AAAA"); } Codice:
__asm__(".code16\n"); __asm__("jmpl $0x0000, $main\n"); void printch(char v){ __asm__ __volatile__ ("int $0x10" : : "a"(0x0e00 | v), "b"(0x0007)); } void print(char* vari){ char* pro="AAAA"; if(vari==pro){ printch('T'); }else{ printch('F'); } } void main() { print("AAAA"); } ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Non conosco la sintassi che hai utilizzato nel codice assembly (cosa significano quei due punti?), ma si direbbe che stai generando l'interrupt prima di aver valorizzato i registri, forse dovresti invertire l'ordine delle istruzioni.
Il tentativo di verificare il valore della stringa nel post successivo è implementato male, l'operatore == in quel caso effettua un contronto tra i puntatori, non tra le stringhe, mi sorprende che in uno dei due casi ti dice che sono uguali; usa strcmp. |
![]() |
![]() |
![]() |
#7 |
Junior Member
Iscritto dal: Oct 2014
Messaggi: 7
|
I due punti servono proprio per valorizzare i registri, per quanto riguarda la funzione domani la provo. Grazie
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Ma se scrivi nel main:
printch('c'); printch('i'); printch('a'); printch('o'); funziona? |
![]() |
![]() |
![]() |
#9 |
Junior Member
Iscritto dal: Oct 2014
Messaggi: 7
|
Si
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Quindi la routine printch dovrebbe essere corretta. Al fine di diagnosticare il problema prova a modificare print così:
Codice:
void print(char* stringa){ char* var=stringa; printf("%s", var); } Codice:
void print(char* stringa){ char* var=stringa; while(*var != '\0'){ printf("%c", *var); ++var; } } |
![]() |
![]() |
![]() |
#11 |
Junior Member
Iscritto dal: Oct 2014
Messaggi: 7
|
Purtroppo così non funziona
![]() |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Non funziona né nel primo né nel secondo caso?
Per "non funziona" intendi dire che stampa una cosa strana o non compila proprio? Su windows 8 funziona senza problemi, a meno dell'interrupt che ovviamente è disabilitato. Purtroppo non ho un ambiente per fare un test completo ![]() |
![]() |
![]() |
![]() |
#13 |
Junior Member
Iscritto dal: Oct 2014
Messaggi: 7
|
Per non funziona intendo che stampa S.
Ma non capisco perchè non dovrebbe funzionare. Per testare compilo con gcc ed eseguo con virtual box il tutto sotto ubuntu |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:35.