Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Autres langages > Assembleur

Assembleur Forum d'entraide Assembleur. Avant de poster -> F.A.Q Assembleur Tutoriels Assembleur

Réponse
 
Outils de la discussion
Vieux 25/08/2008, 15h48   #1 (permalink)
Membre habitué
 
Avatar de TheDrev
 
Date d'inscription: novembre 2006
Localisation: Lyon
Âge: 25
Messages: 154
Par défaut Hello world avec GAS sous mingw

Bonjour !

j essaye d'assembler un hello world trouve ici http://www.tldp.org/HOWTO/Assembly-HOWTO/hello.html
je suis la procédure a la lettre (page suivante du tuto, Building an executable)

L exécutable est créé, mais quand je le lance ca plante (fenêtre "hello a rencontre un probleme et doit fermer...).

Cela plante peut être car je suis sous Windows avec MinGW pour utiliser GCC et as et que les interruptions ne sont donc plus bonne ?
Avez vous une solution ou un autre code ?
__________________
101010
TheDrev est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 25/08/2008, 16h25   #2 (permalink)
Membre expérimenté
 
Avatar de Obsidian
 
Date d'inscription: septembre 2007
Localisation: Évry
Âge: 32
Messages: 544
Par défaut

Citation:
Envoyé par TheDrev Voir le message
Cela plante peut être car je suis sous Windows avec MinGW pour utiliser GCC et as et que les interruptions ne sont donc plus bonne ?
Avez vous une solution ou un autre code ?
Extrait de l'exemple en question :

Code :
       mov	ebx,0	;first syscall argument: exit code
       mov     eax,1   ;system call number (sys_exit)
       int     0x80	;call kernel
Le code assembleur en question appelle directement le noyau. Donc, si tu ne travailles pas sous Linux, ce morceau de code-là ne pourra pas fonctionner.
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 25/08/2008, 17h25   #3 (permalink)
Membre habitué
 
Avatar de TheDrev
 
Date d'inscription: novembre 2006
Localisation: Lyon
Âge: 25
Messages: 154
Par défaut

C'est ce que je pensais... je suis débutant en assembleur (je viens du C/C++).
- Que dois je faire quand je développe sous Windows ? existe il d'autres tables d'interuption (spécifique a DOS et/ou NT ? ).
-J imagine que le code ne pourra pas etre portable si j utilise les interuptions.
- J'ai essaye d'autres méthodes comme passer par du C mais je trouve ca plus lourd a mettre en place que les interruptions, y a t il d autres voie ?

J ai trouve de la doc, je doit utiliser l interupt 21,2 pour afficher tu texte... mais je doit traduire la syntaxe intel en syntaxe AT&T, il doit etre plus courant d utiliser la syntaxe intel pour programmer sous DOS/NT ?
__________________
101010

Dernière modification par TheDrev ; 25/08/2008 à 18h32
TheDrev est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 25/08/2008, 18h45   #4 (permalink)
Membre expérimenté
 
Avatar de Obsidian
 
Date d'inscription: septembre 2007
Localisation: Évry
Âge: 32
Messages: 544
Par défaut

Citation:
Envoyé par TheDrev Voir le message
C'est ce que je pensais... je suis débutant en assembleur (je viens du C/C++).
- Que dois je faire quand je développe sous Windows ? existe il d'autres tables d'interuption (spécifique a DOS et/ou NT ? ).
-J imagine que le code ne pourra pas etre portable si j utilise les interuptions.
- J'ai essaye d'autres méthodes comme passer par du C mais je trouve ca plus lourd a mettre en place que les interruptions, y a t il d autres voie ?

J ai trouve de la doc, je doit utiliser l interupt 21,2 pour afficher tu texte... mais je doit traduire la syntaxe intel en syntaxe AT&T, il doit etre plus courant d utiliser la syntaxe intel pour programmer sous DOS/NT ?
Tu peux utiliser les directives

Code :
asm (".intel_syntax noprefix");//passage en syntaxe intel
asm (".att_syntax noprefix");//passage en syntaxe at & t
si tu veux faire de l'inline à la mode Intel sous GCC (je ne m'en prive pas).

Ensuite, les interruptions en soi ne sont pas des appels systèmes. Elles sont utilisées en tant que telles parce que c'est le moyen le plus conçis d'appeler une même routine, étant donné qu'elles sont invoquées très fréquemment. Elles sont d'autres part un moyen simple pour le programmeur de franchir la barrière entre segment privilégiés et non-privilégiés (typiquement, le passage en mode noyau sous Linux) lorsque tu tournes en mode protégé (soit pour ainsi dire tout le temps depuis le milieu des années 90).

Enfin, il est assez rare que tu fasses appel en temps normal aux appels système directement. La plupart du temps, tu t'appuieras sur les bibliothèques, fussent-elles standard ou non, proposées par le système. Généralement écrites en C, tu passes habituellement les arguments dans la pile et tu appelles la fonction avec un simple call, puisque la routine concernée se trouve dans l'espace de ton programme.

Essaie de faire un printf("Bonjour") en C et de compiler avec l'option -S sous GCC. Tu obtiendras le source assembleur de l'exécutable produit et tu verras ainsi comme il fonctionne.
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 25/08/2008, 23h17   #5 (permalink)
Membre habitué
 
Date d'inscription: mai 2008
Localisation: Paris
Messages: 157
Par défaut

Citation:
Envoyé par Obsidian Voir le message
Tu peux utiliser les directives
Code :
asm (".intel_syntax noprefix");//passage en syntaxe intel
asm (".att_syntax noprefix");//passage en syntaxe at & t
si tu veux faire de l'inline à la mode Intel sous GCC (je ne m'en prive pas).

Merci pour l'astuce Obsidian !!! Je ne connaissais pas l'existence de cette directive. Si j'avais su...
Bon, allez, je vais retourner me coucher en me répétant mentalement : rtfm, rtfm, rtfm...
milouz123 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 25/08/2008, 23h22   #6 (permalink)
Membre expérimenté
 
Avatar de Obsidian
 
Date d'inscription: septembre 2007
Localisation: Évry
Âge: 32
Messages: 544
Par défaut

Citation:
Envoyé par milouz123 Voir le message

Merci pour l'astuce Obsidian !!! Je ne connaissais pas l'existence de cette directive. Si j'avais su...
Bon, allez, je vais retourner me coucher en me répétant mentalement : rtfm, rtfm, rtfm...
Ben, pour être tout-à-fait honnête, c'est ici que j'ai dû la découvrir aussi :-) Sinon, tu peux utiliser NASM aussi ...
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 26/08/2008, 07h42   #7 (permalink)
Membre habitué
 
Date d'inscription: mai 2008
Localisation: Paris
Messages: 157
Par défaut

Oui, mais pour utiliser inline dans gcc, je ne pense pas qu'on puisse... ou alors j'ai encore loupé quelque chose
milouz123 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 26/08/2008, 10h52   #8 (permalink)
Membre expérimenté
 
Avatar de Obsidian
 
Date d'inscription: septembre 2007
Localisation: Évry
Âge: 32
Messages: 544
Par défaut

Citation:
Envoyé par milouz123 Voir le message
Oui, mais pour utiliser inline dans gcc, je ne pense pas qu'on puisse... ou alors j'ai encore loupé quelque chose
« inline », ça veut dire « inséré entre les lignes ». C'est un adjectif. Donc, selon le contexte, c'est soit de l'assembleur au milieu du code en C, soit une fonction directement insérée au milieu du reste plutôt qu'appelée avec un saut vers son emplacement.
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 26/08/2008, 14h56   #9 (permalink)
Membre habitué
 
Date d'inscription: mai 2008
Localisation: Paris
Messages: 157
Par défaut

Oui, euh.... pourquoi cette précision ?
milouz123 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 26/08/2008, 15h42   #10 (permalink)
Membre expérimenté
 
Avatar de Obsidian
 
Date d'inscription: septembre 2007
Localisation: Évry
Âge: 32
Messages: 544
Par défaut

Citation:
Envoyé par milouz123 Voir le message
Oui, euh.... pourquoi cette précision ?
Parce qu'au vu de ton post #7, il me semblait que tu confondais les deux cas de figure. En matière d'assembleur, donc, oui : on peut faire de l'asm inline dans GCC.
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 26/08/2008, 16h13   #11 (permalink)
Membre habitué
 
Date d'inscription: mai 2008
Localisation: Paris
Messages: 157
Par défaut

D'accord, je crois que je comprends mieux le quiproquo.
milouz123 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/08/2008, 15h36   #12 (permalink)
Membre habitué
 
Avatar de TheDrev
 
Date d'inscription: novembre 2006
Localisation: Lyon
Âge: 25
Messages: 154
Par défaut

Re,

J'apprend toujours et j ai compris mon erreur avec les interruptions

J essaye d'afficher un hello world avec nasm et alink,

le code asm est
Code :
global start

section .text
start:
mov edx,msg
mov ah,9
int 21h
 mov ah,4Ch
 int 21h
	
section .data
msg db 'hello', '$'
Je fait
nasm -f coff first.asm
alink first.o -o first.exe

ALINK v1.6 (C) Copyright 1998-9 Anthony A.J. Williams.
All Rights Reserved

Loading file first.o
matched Externs
matched ComDefs
Warning, no entry point specified
Warning - no stack

first.exe me donne un bip suivit de :

▬♦V☺▬♦▬♦☺☺☺ ☻***************?♣Þ*(¶ ↑ ↑**** ♣ ═!╦
║► ┤ ═!┤L═! hello

Qu es ce qui ne va pas avec ce code ou mon assembleur, linkeur ? C'est peut être en rapport avec les warning du linker...
__________________
101010

Dernière modification par TheDrev ; 27/08/2008 à 15h52
TheDrev est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/08/2008, 23h30   #13 (permalink)
Membre expérimenté
 
Avatar de Obsidian
 
Date d'inscription: septembre 2007
Localisation: Évry
Âge: 32
Messages: 544
Par défaut

Citation:
Envoyé par TheDrev Voir le message
first.exe me donne un bip suivit de :

▬♦V☺▬♦▬♦☺☺☺ ☻***************?♣Þ*(¶ ↑ ↑**** ♣ ═!╦
║► ┤ ═!┤L═! hello

Qu es ce qui ne va pas avec ce code ou mon assembleur, linkeur ? C'est peut être en rapport avec les warning du linker...
Apparement, l'interruption commence à lire ton texte en mémoire bien avant l'emplacement où il débute réellement. Vérifie que ton segment de données débute bien au bon endroit.
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 01/09/2008, 19h22   #14 (permalink)
Membre éprouvé
 
Avatar de dapounet
 
Date d'inscription: juillet 2007
Localisation: Belgique
Messages: 410
Par défaut

Ça marchera peut-être mieux en disant à NASM de générer du code 16 bits :
Code :
BITS 16

global start

section .text
start:
mov edx,msg
mov ah,9
int 21h
 mov ah,4Ch
 int 21h
	
section .data
msg db 'hello', '$'
Il y a un très bon tutoriel qui explique comment faire de l'assembleur "moderne" ici : http://beuss.developpez.com/tutoriels/pcasm/
__________________
:wq
dapounet est déconnecté   Envoyer un message privé Réponse avec citation
NEWS ASSEMBLEURFAQ ASSEMBLEURLIVRES ASSEMBLEUR

Réponse

Précédent   Forum des développeurs > Autres langages > Assembleur



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide