2017-02-12 1 views
1

J'apprends le développement de système d'exploitation et un débutant bien sûr. Je voudrais construire mon système dans un environnement en mode réel qui est un environnement 16 bits utilisant le langage C.Comment fonctionne la fonction `asm()` dans le langage C?

En C, j'ai utilisé une fonction asm() pour convertir les codes à 16 bits comme suit:

asm(".code16") 

qui dans la langue de GCC pour générer 16 bits (executables pas exactement bien).

Question:

Supposons que j'ai deux fichiers d'en-tête et head1.hhead2.h et un fichier main.c. Le contenu du main.c fichier sont les suivants:

asm(".code16"); 
#include<head1.h> 
#include<head2.h> 
int main(){ 
    return 0; 
} 

Maintenant, Depuis que je mon code avec la commande pour générer un fichier exécutable 16 bits puis inclus head1.h et head2.h, dois-je faire la même chose dans tous les fichiers d'en-tête que je dois créer? (ou) Est-il suffisant d'ajouter la ligne asm(".code16"); une fois?

OS: Ubuntu

compilateur: Gnu CC

+4

Je vous recommande de ne pas utiliser gcc pour compiler le code 16 bits. Ce que vous utilisez est un kludge qui cause beaucoup de problèmes. – fuz

Répondre

4

Pour répondre à votre question: Il suffit pour le bloc asm soit présent au début de l'unité de traduction.
Donc, le mettre une fois au début fera l'affaire.

Mais vous pouvez faire mieux: vous pouvez l'éviter complètement et utiliser the -m16 command line option (available from 5.2.0) à la place.

Mais vous pouvez faire mieux: vous pouvez l'éviter complètement.


L'effet de -m16 et .code16 est de faire du code exécutable 32 bits en mode réel, il est pas pour produire du code en mode réel.

Regardez

16.c

int main() 
{ 
    return 4; 
} 

la première extraction .text secteur

>gcc -c -m16 16.c 
>objcopy -j .text -O binary 16.o 16.bin 
>ndisasm 16.bin 

nous obtenons

00000000 6655    push ebp 
00000002 6689E5   mov ebp,esp 
00000005 6683E4F0   and esp,byte -0x10 
00000009 66E800000000  call dword 0xf 
0000000F 66B804000000  mov eax,0x4 
00000015 66C9    o32 leave 
00000017 66C3    o32 ret 

Ce qui est juste code 32 bits rempli avec des préfixes de taille d'opérande.
On a real pre-386 machine this won't work as the 66h opcode is UD.


Il y a des vieux compilateurs 16 bits, comme Turbo C , qui abordent la problématique des applications en mode réel correctement.

Turbo C code generation options

Sinon, passez en mode protégé dès que possible ou envisager d'utiliser UEFI.


Il est disponible en ligne. Ce compilateur est aussi vieux que moi!

+1

["Ne mentionnez pas la guerre!"] (Https://www.youtube.com/watch?v=yfl6Lu3xQW0). Moins il y a de gens qui connaissent Turbo-C (++), mieux c'est! –

0

Il est inutile d'ajouter asm("code16") ni dans head1.h ni head2.h.

La raison principale est le fonctionnement du pré-compilateur C. Il remplace le contenu de head1.h et head2.h au sein de main.c.

Veuillez vérifier How `#include' Works pour plus d'informations.

J'espère que ça aide!

Meilleures salutations,

Miguel Ángel