2010-04-27 19 views
4

Je construis un système d' exploitation 16 bits. Mais le tableau de caractères ne semble pas fonctionner.La construction d 'un tableau de caractères OS à 16 bits ne fonctionne pas

Voici mon exemple de code du noyau:

asm(".code16gcc\n"); 
void putchar(char); 

int main() 
{ 
char *str = "hello"; 

putchar('A'); 
if(str[0]== 'h') 
    putchar('h'); 

return 0; 
} 


void putchar(char val) 
{ 

    asm("movb %0, %%al\n" 
     "movb $0x0E, %%ah\n" 
     "int $0x10\n" 
     : 
     :"m"(val) 
    ) ; 
} 

Il imprime:

A 

cela signifie que la fonction putchar fonctionne correctement, mais

if(str[0]== 'h') 
     putchar('h'); 

ne fonctionne pas.

Je compilez par:

gcc -fno-toplevel-reorder -nostdinc -fno-builtin -I./include -c -o ./bin/kernel.o ./source/kernel.c 
ld -Ttext=0x9000 -o ./bin/kernel.bin ./bin/kernel.o -e 0x0 

Que dois-je faire?

+2

Comment échoue-t-il en particulier? Quel résultat ou erreurs voyez-vous? –

+0

Il donne le caractère 'A'. C'est le putchar ('A') qui fonctionne. Mais le putchar ('h') ne fonctionne pas, ce qui signifie que la condition dans si l'instruction échoue. Mais j'ai initialisé str = "bonjour"; Alors qu'est-ce qui ne va pas? – brainbarshan

+0

Pourriez-vous essayer d'imprimer ce qui est là, faire un 'putchar (str [0])' pour voir ce que vous trouvez. Je n'ai pas regardé attentivement mais vous voulez vous assurer que l'initialisation que vous pensez avoir faite a vraiment bien fonctionné. Ensuite, nous pouvons diagnostiquer les problèmes de ce que nous voyons. Putchar (str [0]) imprime un signe de flèche. – Ukko

Répondre

1

Votre segment de données n'est probablement pas chargé dans la cible. Que faites-vous après le lien avec votre nouveau fichier kernel.bin, qui est en fait un fichier elf?