Rechercher : dans
Par :

Apprendre l'assembleur

Dernière réponse le 22 déc 2007 à 21:28:09 Edward Withen, le 13 déc 2007 à 18:25:03 
 Signaler ce message aux modérateurs

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 http://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.

Meilleures réponses pour « Apprendre l'assembleur » dans :
Liens utiles assembleur x86 Voir Voici quelques liens utiles pour l'assembleur x86. Le but étant de compiler des documents pertinents autant pour ceux qui débutent que pour ceux qui sont à l'aise dans ce domaine. Tutoriels Références complètes Assembleur sous...
[Photofiltre]Réaliser un assemblage de 2 images VoirPhotofiltre est un logiciel de retouche d'image. Cette astuce fonctionne aussi bien avec Photofiltre qu'avec Photofiltre Studio Dans ce cas précis, Photofiltre va permettre d'assembler un collage c'est-à-dire de coller une deuxième image (en...
Exercice assembleur x86 nombre premier VoirIntroduction Notions abordées dans cet exercice Enoncé Rappel Corrigé Explication Introduction Ce petit exercice d'assembleur vise les architectures x86 (Processeurs Intel et Amd 32 bits) et utilise la syntaxe de Nasm, un assembleur...
Compiler un programme assembleur avec Nasm VoirAvec Linux Etape 1. Créer un fichier source Etape 2. Assembler le fichier source Etape 3. Création de l'executable Etape 4. Execution du programme Avec windows Etape 1. Installer les logiciels nécessaires Etape 2. Créer un fichier...
Introduction à l'assembleur VoirLes prérequis nécessaires Le langage assembleur est très proche du langage machine (c'est-à-dire le langage qu'utilise l'ordinateur : des informations en binaire, soit des 0 et des 1). Il dépend donc fortement du type de processeur. Ainsi il...
Assembler un PC VoirDe l'assemblage d'un ordinateur Un ordinateur de type PC est modulaire, c'est-à-dire qu'il peut être monté en assemblant des éléments matériels de différents constructeurs, afin d'obtenir un ordinateur conforme à ses besoins. Les éléments...
Liste des instructions en assembleur VoirTableau des principales instructions en assembleur Voici une liste (non exhaustive) des principales instructions en assembleur des processeurs 80x86, ainsi que du code machine qui leur est associé et de leur taille en mémoire. Les valeurs val et...

1

kilian, le 13 déc 2007 à 18:39:13

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

Répondre à kilian

2

Edward Withen, le 13 déc 2007 à 18:52:35

Merci.
Mais ces commandes-là c'est pour linux. Comment je fait pour compliler sous windows?

Répondre à Edward Withen

3

kilian, le 13 déc 2007 à 18:55:38

Avec dev c++ ça doit être faisable.

Répondre à kilian

4

kilian, le 13 déc 2007 à 19:13:36

Ah oui mais non chuis bête, c'est du code qui ne passe que sous Linux: il utilise l'interruption 0x80 propre à Linux.

Répondre à kilian

5

Edward Withen, le 14 déc 2007 à 18:31:42

Bon, je vien de trouver comment télécharger MASM32bits. Il faut aller ici http://masm32.online.fr/m32v9r.zip

Seulement, pour que ca marche, il faut faire une manip:

Démarrer>Programmes>Accesoires, et clic droit sur "Invite de commande", dans l'onglet "Raccourcis", Mettez "%HOMEDRIVE%\" (sans les guillemets) dans "Démarrer dans". vous validez et vous pouvez installer MASM32!

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

Répondre à Edward Withen

6

Aldo, le 15 déc 2007 à 01:04:11

Regarde la F.A.Q Assembleur : http://asm.developpez.com/faq/

Répondre à Aldo

7

belhauss, le 15 déc 2007 à 22:00:38

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

Répondre à belhauss

8

Edward Withen, le 17 déc 2007 à 22:16:34

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.

Répondre à Edward Withen

9

kilian, le 17 déc 2007 à 23:31:17

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)

Répondre à kilian

10

Edward Withen, le 18 déc 2007 à 18:39:57

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.

Répondre à Edward Withen

11

kilian, le 18 déc 2007 à 20:41:28

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 http://www.cppfrance.com/codes/ASM-INLINE-AVEC-GCC-SYNTAXE-I­NTEL_38813.aspx

Répondre à kilian

12

Edward Withen, le 22 déc 2007 à 20:16:09

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.

Répondre à Edward Withen

13

kilian, le 22 déc 2007 à 21:03:04

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....

Répondre à kilian

14

 Edward Withen, le 22 déc 2007 à 21:28:09

Merci pour ton aide précieuse kilian!

Répondre à Edward Withen
Collection CommentÇaMarche.net