|
|||||||
|
|
|
![]() |
|
|
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: 1370
|
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: 1370
|
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: 04:08.



















