Apprendre l'assembleur

Résolu/Fermé
Utilisateur anonyme - 13 déc. 2007 à 18:25
 Utilisateur anonyme - 22 déc. 2007 à 21:28
Bonjour,

Je sais programmer en C et en C++, et maintenant, j'aimerai apprendre l'assembleur sous Windows.

Mais à chaque fois que je consulte un tutoriel, je trouve un code assembleur, je le teste mais erreur lors de la compilation. :(

C'est tiré de Wikipédia https://fr.wikipedia.org/wiki/Assembleur#Exemples_simples

.global _start

BONJ: .ascii "Bonjour\n"

_start: mov $4 , %eax
mov $1 , %ebx
mov $BONJ , %ecx
mov $8 , %edx
int $0x80

mov $1 , %eax
mov $0 , %ebx
int $0x80


Et c'est aussi que j'ai du mal à choisir le bon assembleur (MASM, FASM, TASM, NASM....):

SVP, pouvez-vous m'indiquer un bon tutoriel, et aussi quel assembleur choisir?

D'avance merci.
A voir également:

14 réponses

kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Non membre Dernière intervention 5 février 2025 1 526
13 déc. 2007 à 18:39
Aucun de tout celà, ça c'est la syntaxe "as" sous Linux.
Pour compiler, tu enregistres ça sous le nom bonjour.S et tu executes ces commandes:
as test.S -o test.o
ld test.o -o test
0
Utilisateur anonyme
13 déc. 2007 à 18:52
Merci.
Mais ces commandes-là c'est pour linux. Comment je fait pour compliler sous windows?
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Non membre Dernière intervention 5 février 2025 1 526
13 déc. 2007 à 18:55
Avec dev c++ ça doit être faisable.
0
Bon, je vien de trouver comment télécharger MASM32bits. Il faut aller ici http://masm32.online.fr/m32v9r.zip


Et pour la documentation et les tutoriels, il y a des dossier qui contiennent des exemples.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Regarde la F.A.Q Assembleur : https://asm.developpez.com/faq/
0
belhauss Messages postés 69 Date d'inscription dimanche 24 décembre 2006 Statut Membre Dernière intervention 9 février 2012 3
15 déc. 2007 à 22:00
Hello !!
voici un lien réalisé par mon Prof xD Oumnad http://z.oumnad.123.fr/
sélectioné Microprocesseurs ya un complitateur pour windows et même klk exeples et un pdf bien détaillé
Enjoy It
0
Utilisateur anonyme
17 déc. 2007 à 22:16
Voilà, je lisai des docs sur l'assembleur, et puis je suis tombé sur ça :

Pour écrire des instructions en assembleur en C, il faut taper:

asm
{
/* instructions asm*/
}



J'ai tout de suite tésté ça, mair lors de la compilation, il y a l'erreur ----"Syntax error befor '{' token"-----

J'ai essayé de mettre asm comme une fonction ( en écrivant "asm ( ) ") mais rien à faire.

J'ai tésté cette méthode sous CodeBlocks et DevCpp, et pratiquement la meme erreur.

SVP, comment inclure des instructions en assembleur dans un programme en C?

D'avance merci.
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Non membre Dernière intervention 5 février 2025 1 526
17 déc. 2007 à 23:31
Avec dev c++ logiquement c'est
__asm__( /*instructions */)

ou alors pour être sûr que le code sera inséré là où il faut (sans optimisations):
__asm__ __volatile__( /*instructions */)

Et la syntaxe doit être du AT&T et non pas intel.

Exemple, ce qui s'écrit comme ça en intel:
mov eax, 1
push dword [eax+2]

donnera en AT & T:
movl $1, $eax
pushl 2(%eax)
0
Utilisateur anonyme
18 déc. 2007 à 18:39
Merci.

Mais je dois avouer qu'en AT&T je ne m'y connais pas tellement, par contre en INTEL je connais les bases (et aussi que Intel est plus facil à écrire lol ).

SVP, Il n'y aurait pas un moyen pour faire de l'Intel depuis le compilateur?

Merci encore.
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Non membre Dernière intervention 5 février 2025 1 526
18 déc. 2007 à 20:41
A vrai dire il n'y a pas beaucoup de différence. C'est le même assembleur mais avec deux syntaxe différente, et peu de choses changent à vrai dire:

_Les opérandes sont inversés
_La taille d'une valeur n'est plus signalée par les mots dword, word ou byte, c'est juste une lettre à ajouter à l'opérateur.
Par exemple une instruction mov qui déplace 4 octets s'appelera movl (l pour long), pour 2 octets c'est movw (w pour word) et movb pour 1 octet (b pour byte). Ca évite de faire des
mov eax, dword machin

Les registres sont préfixés par le caractère % (ex: %eax) et les références mémoire se font avec des parenthèses en mettant l'incrémentation devant la parenthèse: [eax + 2] sera remplacé par 2(%eax)

Bon rassure-toi tu peux quand même utiliser la synatxe intel en utilisant la ligne
.intel_syntax noprefix

Voir https://codes-sources.commentcamarche.net/
0
Utilisateur anonyme
22 déc. 2007 à 20:16
Merci.

Voilà, j'essayais de faire quelques essais, et j'ai écrit le code suivant :

#include <stdio.h>
#include <string.h>


int main()
{
int test=10;


asm (".intel_syntax noprefix");
asm ("mov eax, dword [test]");
asm (".att_syntax noprefix");



}
---------------------
Mais, après la compilation, l'erreur suivante apparait :

" Undifined reference to 'test' "

Pourtant j'ai bien écrit "int test = 10", mais ça n'a pas l'air de marcher.

SVP, comment remedier à cette erreur?

D'avance merci.
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Non membre Dernière intervention 5 février 2025 1 526
22 déc. 2007 à 21:03
Oui mais test n'a pas une adresse mémoire constante car c'est une variable locale, donc stockée dans la pile. Donc il n'a pas de référence.
Ca marchera si tu déclares test en tant que variable globale.

Sinon, tu peux accéder à la zone mémoire pointée par test ou encore au registre qui contient la valeur de test.
C'est décrit ici dans la partie "extended asm":
http://asm.sourceforge.net/articles/rmiyagi-inline-asm.txt

Sinon, à priori, test est situé dans la valeur pointée par esp. Mais si la compilation a été optimisée, il est possible que test ne soit qu'un registre....
0
Utilisateur anonyme
22 déc. 2007 à 21:28
Merci pour ton aide précieuse kilian!
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Non membre Dernière intervention 5 février 2025 1 526
13 déc. 2007 à 19:13
Ah oui mais non chuis bête, c'est du code qui ne passe que sous Linux: il utilise l'interruption 0x80 propre à Linux.
-1