https://www.dosbox.com/wiki/DisplayDOSBox emulates a S3 Video device and is capable of emulating a Hercules, CGA/EGA or VGA monitor.
donc je confirme, l'int 10h fonctionne.
Ce que je cherche à faire est très peu commun d'où la difficulté de trouver des informations pour faire un programme. Utiliser des interruptions du DOS c'est utiliser des fonctions déjà faites or je veux essayer de faire un programme sans m'aider avec des fonctions. C'est le problème avec MASM: tous les programmes que j'ai trouvé sur internet utilisent des fonctions déjà faites comme "printf". Je voudrais faire un programme mais tout faire moi même, sans utiliser des fonctions externes. Est-ce possible ?
Refaire la fonction printf avec des fonctions fournies par le bios, oui, ou en mode texte, tu peux taper directement dans l'adresse mémoire video et y saisir ton texte, en mode graphique, c'est beaucoup trop complexe.
Comme ça je dirais Nasm pour l'assembleur. avec mingw pour l’édition de liens.
Trop complexe est un poil exagérer , même si pour un débutant il ne saurait sûrement pas faire cela correctement.
On général on utilise du bitmap font en mode graphique pour afficher du texte, ce qui serait complexe (pour un débutant) c'est de refaire un blitter. (Je sais que tu sais cela , mais plus pour détailler comment faire s'il voudrait vraiment le faire lui même).
Comme on te l'a dit précédemment non , mais si ton envie est de réinventer la roue comme le printf, faudra rester sur du dos (comme je te l'ai deja dit sur Windows tu devra passer par API Windows pour l'affichage).
Ben en faite , si on incluse le monde de la programmation homebrew sur console c'est assez commun de refaire le printf (même refaire une partie de la pipeline graphique en faite que cela soit en 2D ou 3D)Ce que je cherche à faire est très peu commun [...]
Je voudrais faire un programme mais tout faire moi même, sans utiliser des fonctions externes. Est-ce possible ?
Par contre sur PC (enfaîte sur tout type de machine) c'est assez complexe si tu veux absolument tout gérer , parce que ça demande des connaissances allant bien au delà des connaissances sur l'asm (plutôt sur l'architecture des ordis).
Même si techniquement sur des machines relativement simple comme la Nes ou même un Amstrad CPC c'est relativement possible de gérer sa machine à 100% sur un délai assez court
Merci à vous tous pour les petits guides que vous m'avez donné. Je pense que la question est "résolue". Résumé:
- Nasm et Tasm ne peuvent générer que des programmes COM qui peuvent être exécutés avec DosBox
- Les programmes EXE codés par quelqu'un en assembleur ne sont pas possibles
Est-ce correct ?
Citation Envoyé par FRANCI5 Voir le message
Mais on peut ou pas générer des EXE(compatibles avec windows 7) avec Nasm ?C'est pour cela qu'il faut un linker, fourni avec MinGW (ou un autre compilateur).Comme on te l'a dit précédemment non
Pour la programmation graphique, tu peux utiliser des modes VESA 32 bits (int 10h ax=0x4fxx), permettant d'assez facilement aller taper dans les pixels avec une gestion de couleur RVB facile à l'écran. Tu seras par contre obligé d'utiliser les fonctions BIOS int 10h pour l'activer. Par contre oublie tous les anciens modes VGA qui sont une galère.
Pour gérer l'affichage de texte en mode graphique, c'est plus compliqué, il faut "dessiner" les caractères et donc utiliser une police bitmap comme évoqué, et éventuellement gérer des transformations pour la taille. Et je parle même pas d'utiliser une police comme Times new Roman ou autre, ou là il faut décoder le format truetype ou opentype.
Mais connais-tu un compilateur avec un linker pour générer un EXE qui est compatible sous Windows 7 64 bits ?
Et est-ce qu'il y a des instructions ou des registres qu'il ne faut pas utiliser en 64 bits ?
PS: j'ai réussi à faire une version obj du programme mais c'était au moment de la compilation que ça marchait pas avec l'erreur du winmain@16
Ben si on parle de compilateur oui , MingW on est un et techniquement on peut l'utiliser sans Nasm pour faire de l'assembleur (par contre si on t'a pas conseillé cette méthode c'est que l'assembleur utilisé par les compilateurs sont pas super user friendly ).
NT:Ici je parle bien de compilateur donc un compilateur C/C++ ou autre , un assembleur c'est autre choses genre Nasm (et il n'ont pas forcément vocation de créer des binaires compatibles pour des OS).
MinGW ne compile pas pour du 16 bits
On te l'a dit mainte fois , Nasm + MinGW ou alors MinGW uniquement
(Et Asmou t'as conseillé MASM).
Il faut indiquer à Nasm quel type de code tu fais, avec la directive :
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part [BITS 32]
Par contre, pas de code 16 bits sur un OS 32 bits, dans ce cas tu ne pourras pas utiliser les fonctions du BIOS ou du DOS, sauf à utiliser dosbox.
Code : Sélectionner tout - Visualiser dans une fenêtre à part [BITS 64]
Sinon pour faire un .exe depuis ton code asm :
gcc avec ces paramètres va appeler le linker ld.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 nasm -fwin32 fichier.asm gcc fichier.obj -o fichier.exe
Ton source .asm doit contenir la directive :
dans la section .text
Code : Sélectionner tout - Visualiser dans une fenêtre à part _main:
nécessaire à gcc.
Ce code ne vient pas de moi je l'ai copié et essayé de le compiler avec vos conseils mais cette fois ci l'erreur est:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 BITS 64 section .data str: db "hello world", 10, 0 section .text global WinMain _main: MOV RAX, 1 MOV RDI, 1 MOV RSI, str MOV RDX, 15 syscall MOV RAX, 60 MOV RDI, 0 syscall
undefined reference to "WinMain"
La ligne Winmain est l'équivalent de main pour les API windows.
Le code est bizarre, je ne suis pas spécialiste assembleur sous Windows, mais pour moi on utilise pas syscall avec passage de paramètres par registre pour appeler les fonctions systèmes, mais on empile les paramètres et appele la fonction par un call.
Si il s'agit de faire un programme dans la console, ne met pas winmain.
Regardes ici:
https://bitcodersblog.wordpress.com/...n-nasm-part-1/
ça te montre la méthode Linux (avec int 0x80 : en 32 bits sous linux on utilise int 0x80, en 64 bits syscall) et en dessous la méthode Windows.
En cherchant sur divers forums, le problème pourrait être à cause de windows. Il faudrait obligatoirement utiliser l'API de Windows(ses fonctions).
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager