begin process at 2010 03 16 15:38:24
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

divers

 > EXEMPLES SIMPLES DE FICHIERS ÉCRITS AVEC NASM

EXEMPLES SIMPLES DE FICHIERS ÉCRITS AVEC NASM


 Information sur la source

Note :
9,5 / 10 - par 2 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :divers Classé sous :masm, fichier, écrire Niveau :Débutant Date de création :12/10/2005 Vu / téléchargé :5 729 / 620

Auteur : Nasman

Ecrire un message privé
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Cette source a pour but d'aider les débutants utilisant Nasm (et Alink)à créer différents fichiers 16 et 32 bits avec différentes extensions. Quand on débute il est difficile de trouver les bonnes déclarations à faire pour créer des fichiers ne plantant pas à la compilation.
Les différents formats proposés sont:
.com (16bit compilé directement en exécutable - implantation en 100h)
.sys (idem ci dessus mais implanté en 00h)
.exe 16bits (compilation en .obj et linkage en .exe)
.exe 32bits - format PE (compilation en .obj et linkage en .exe)
.dll 32bits - format PE-dll (compilation en .obj et linkage en .dll) avec un executable utilisant la dll

D'autre possibilités existent mais je ne les ai pas testé (par exemple créer un .com via un fichier .obj)


 Conclusion

Cette source est peut-être à ranger dans la catégorie Tutoriels mais il faudrait que j'étoffe un peu plus.

Remarque le fichier appdll.exe appelle la dll madll.dll mais la version exécutable ne marchera probablement pas sur votre PC car le chemin de la dll est code "en dur". Il faudra corriger le chemin dans le fichier source et recompiler.

Bonne programmation.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip REPRÉSENTATION D'UNE SPHÈRE EN 3D (FLAT SHADING)
Source avec Zip CRÉATION DE DIFFÉRENTS EXÉCUTABLES AVEC NASM ET ALINK
Source avec Zip Source avec une capture PROGRAMME DE VISUALISATION ET D'ANALYSE SPECTRALE DE FICHIER...
Source avec Zip CRÉATION DE GRAPHIQUES AVEC LES API WINDOWS
Source avec Zip DLL EFFECTUANT UNE TRANSFORMÉE DE FOURIER RAPIDE

 Sources de la même categorie

Source avec une capture DESSIN DE RECTANGLES (POSITION, TAILLE, COULEUR, ÉPAISSEUR) par macsou01
RECHERCHE DES PALINDROMES D'UN TEXTE SAISI. par PCBill
Source avec Zip LIBRAIRIE GRAPHIQUE (ET PLUS) EN MODE RÉEL par epineurien
Source avec Zip Source avec une capture LIB PROGRESSBAR (PERSONNALISABLE , DÉGRADÉ DE COULEUR,POURCE... par knetus
Source avec Zip Source avec une capture AFFICHE COULEUR par knetus

 Sources en rapport avec celle ci

Source avec une capture LECTURE TOUCHE CLAVIER[MASM] par w4kfu
Source avec Zip LIBRAIRIE GRAPHIQUE (ET PLUS) EN MODE RÉEL par epineurien
Source avec Zip OBTENIR LA VERSION DU SYSTEME,SON ENVIRONNEMENT,LE SERVICE P... par ToutEnMasm
Source avec Zip SIMPLE TRANSFER DE FICHIERS UTILISANT FTP par BLUEBIBUBBLE
Source avec Zip AIDE ASSEMBLEUR AVEC EXEMPLES, SUJETS ABORDÉS: PROCESSEUR, M... par BABASSE

Commentaires et avis

Commentaire de eRoZion le 13/10/2005 00:39:08

J'ai pas le temps de regarder aujourd'hui mais je commence à m'intéresser à l'assembleur et ça a l'air très utile. ;)

Pour les fichier .exe, il faut les renommer sinon ça ne fonctionne pas au téléchargement, en .ex_ par exemple.


eRoZion

Commentaire de roygrizzly le 03/05/2006 09:18:06

Ce code fonctionne parfaitement!!
J'aimerai savoir comment il faut faire pour afficher le contenu d'un registre, qui est chez moi un entier? Voici ma fonction qui fait comme un printf en C mais dans une fenetre: le paramètre est mis dans la pile avant l'apel à printf

printf:
pop AX
mov dword [Message],AX
push byte 0
push dword Titre
push dword Message
push byte 0
call [MessageBoxA]
ret

et ça marche pas, c'est un problème de type apparament:
a.asm:15: error: mismatch in operand sizes
make: *** [assemble] Error 1

merci

Commentaire de Nasman le 03/05/2006 09:40:01

Bonjour ROYGRIZZLY,

Je ne sais pas ce qu'il y a dans AX (type de données) mais ce qui est sur c'est qu'avec ton pop AX tu récupère un word (deux octets - AX est un registre 16 bits).
Le mov dword [Message],AX te génère une erreur car tu demandes d'écrire un dword à partir de l'emplacement Message alors que AX est un word.
Je ne pense pas que ce soit l'instruction à utiliser pour résoudre ton problème mais en ce qui concerne l'erreur "mismatch in operand sizes" elle devrait être résolue avec:
movzx eax,ax          ;garde les deux octets de poids faible et remplit les deux autres avec zéro
mov [Message],eax     ;écrit 4 octets à partir de l'adresse Message (le dword est implicite)

A+

Commentaire de roygrizzly le 03/05/2006 10:13:58

dans AX, il y a un entier, ici 3, en faite c'est du code généré par mon compilateur, donc il y a la fonction main et la fonction printf, pour passer 3 en paramètre de la fonction printf [printf(3)] je fais un push 3

extern ExitProcess
import ExitProcess Kernel32.dll
extern MessageBoxA
import MessageBoxA user32.dll

segment code public use32 class=CODE
..start:
call main
push byte 0
call [ExitProcess]
ret
;--------------------------
printf:
pop ax
movzx eax,ax
mov [Message],eax
push byte 0
push dword Titre
push dword Message
push byte 0
call [MessageBoxA]
ret
;--------------------------

main:
push 3
call printf
ret
segment data public use32 class=DATA
Titre db "Affichage des messages :",0
Message db "...",0

Tampon resd 100

ça assemble mais quand je le lance, la fenetre est bizarre, elle n'a pas de bordure ni de titre, et ça affiche 7 et à coté un carré puis quand je fais OK, le programme plante, windows me dit que le prog a rencontré un problème et qu'il l'a fermé

merci

Commentaire de Nasman le 03/05/2006 11:06:56

Je crois savoir la raison du plantage.

Sur la pile tu as empilé la valeur 3 (quoique Nasm me génère une erreur car la taille de la données n'est pas indiquée). Il faut mettre push dword 3 (taille d'un integer en C) ou push byte 3 (de toute façon windows t'empilera 4 octets mais push byte 3 prend moins de place en mémoire).
Après la valeur empilée le système empile l'adresse de retour qui suit l'appel du call - c'est cette valeur que tu récupères dans ax !!! - D'où un affichage non prévu.
Après le ret tu place ta valeur 3 dans eip - ce qui n'est pas apprécié du système.

Pour corriger:
1) convertir la valeur numérique 3 en une chaine (pour être affichée par MessageBox - ta routine devrait traiter un dword soit 4 octets soit une chaine de 8 + 1 caractères (0 terminal)
2)tu peux empiler ce que tu veux mais garde à l'esprit qu'après le call esp pointe sur l'adresse de retour et esp+4 sur le dernier push précédent le call.
3)après traitement le ret dépile le sommet de pile dans eip
4)faire le ménage et dépiler les octets mis sur la pile avant le call. Soit avec un pop (ou add esp,xxxx)dans le programme d'appel, soit avec un ret xxxx dans le sous programme;

A+

Commentaire de roygrizzly le 03/05/2006 12:49:37

1)la conversion c'est trop compliqué pour moi!!! les codes que j'ai trouvé sont trop longs et je comprends pas tout, y'a t il moyen de mettreune chaine de caractères dans la pile?
2)si je comprends bien, pour accèder à mon paramètre, dans le sus programme, il faut que je fasse:

mov bx, esp ;sauvegarde de esp
add esp,4
pop ax ;récupération du parmètre
mov esp, bx ;restauration de esp

ou bien:

add esp,4
pop ax,
ret esp,4
?

3)eip prends la valeur du sommet de pile si je comprends bien? il doit y avoir quoi dans le sommet de pile?
4)je ne peux pas dépiler toute la pile avant d'apeller le sous programme vu que j'ai besoin du ou des paramètres

merci


Commentaire de roygrizzly le 03/05/2006 12:52:08

désolé j'ai fait une faute : il faut lire
sub esp,4
et non
ret esp,4

Commentaire de Nasman le 03/05/2006 13:00:43

J'ai repris ton code pour lui faire afficher un message. Pour convertir en chaine on verra après...

extern ExitProcess
import ExitProcess Kernel32.dll
extern MessageBoxA
import MessageBoxA user32.dll

segment code public use32 class=CODE
..start:
call main
push byte 0
call [ExitProcess]
ret
;--------------------------
printf: ;esp pointe sur l'adresse de retour (le ret qui suit le call printf)
mov eax,[esp+4] ;esp+4 pointe sur les données empilées
mov [Message],eax
push byte 0
push dword Titre
push dword Message
push byte 0
call [MessageBoxA]
ret 4 ;dépile les données après le retour à main (un dword)
;--------------------------

main:
push dword 0x00434241 ;chaine "ABC",0
call printf
ret
segment data public use32 class=DATA
Titre db "Affichage des messages :",0
Message db "...",0

Tampon resd 100

A+

Commentaire de roygrizzly le 03/05/2006 13:26:29

cool, ça marche, merci beaucoup, pour afficher un 0 j'ai juste à faire :
push dword 0x00000030
pour 10:
push dword 0x00003031
pour les négatifs:
push dword 0x0000312D
avec ce système on peut aficher un chiffre entre -999 et 9999
il faudrais concaténer plusieurs dword si le chiffre est grand (ou petit si négatif)
je vais essayer de programmer ça en C vu que c'est le boulot du compilateur

merci

Commentaire de Nasman le 03/05/2006 13:45:27

Tu n'est pas obligé de stocker ta chaine a une adresse précise, tu peux la mettre sur la pile et indiquer son adresse pour la MessageBox

printf: ;esp pointe sur l'adresse de retour (le ret qui suit le call printf)
lea eax,[esp+4] ;eax vaut esp+4
push byte 0
push dword Titre ;le titre est dans les data
push eax ;la chaine à afficher est dans la pile
push byte 0
call [MessageBoxA]
ret 8 ;dépile les données après le retour à main (deux dword)
;--------------------------

main:
push dword 0x0072756F ;chaine "our",0
push dword "Bonj"
   ; met Bonjour dans la pile, on peut aussi le faire avec des
   ; sub esp,8 ;reserve 8 octets
   ; mov [esp],dword "Bonj"
   ; mov [esp+4],dword 0x0072756F
call printf
ret
segment data public use32 class=DATA
Titre db "Affichage des messages :",0

A+

Commentaire de roygrizzly le 03/05/2006 14:28:39

je viens de comprendre ton code, en faisant :
push dword 0x00000031
push dword 0x39393939
j'obtient 99991 !!

merci

Commentaire de gokudo le 19/07/2007 09:07:27

j'ai rien compris mais ça a l'air interessant. je vai apprendre un pe et venir vous embeter avec mes questions ^_^. merci beaucoup nasman pour c tuto.

Commentaire de Nasman le 19/07/2007 09:24:17

Bonjour GOKUDO,

Tu peux trouver des informations complémentaires sur les modes de compilations dans la source suivante
http://www.asmfr.com/codes/CREATION-DIFFERENTS-EXECUTABLES-AVEC-NASM-ALINK_37036.aspx

A+

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Compilation d'un fichier COM avec MASM [ par Oeil_de_taupe ] Bonjour,J'imagine que mon manque de neurone peut expliquer mon problème mais je viens de chercher pendant toute l'arprès-midi sans trouver la solution developpez une routine interruption erreur critique 24h [ par msm_007 ] Salut a tous. je suis débutant ds ce domaine c'est pourquoi je besoin d'aide. je veux reimplementer les routines d'interruption de DOS suivante : Tra Radasm [ par Le cancre ] Bonjour à tous, je débute en asm, j'utilise Masm ...Affichage de messagebox,et tout le tralala c'est sympa mais il me manque une interface alors j'ai MASM EXE2BIB Windows XP [ par aerotech ] Un gentil correspondant aurait-il un EXE2BIN.EXE pouvant fonctionner sous windows XP.En effet, MASM fonctionne très bien, ainsi que LINK, mais le exe2 Creer un exe qui va chercher un fichier texte sur le net ? [ par sharkjo ] Voila mon souci je cheche a creer un programe ce programme grace a un bouton quand on clique dessus il ca aller checher des infos que jai place dans u fichier .bas .bat [ par jonquille80 ] Bonjour,J'ai besoin de modifier une application qui fonctionne sur dos j'ai deux fichiers .bat et .bas je n,arrive pas à ouvrir aucun de ce fichiers j Generer un manifest pour utiliser la msvcrt.dll avec masm [ par ToutEnMasm ] Bonjour,Pour pouvoir utiliser directx 9 avec masm,j'ai lié la msvcrt.lib a mon projet.Celle ci permet d'utiliser la CRT run time,directx en a besoin p Masm et DIRECTX9 [ par ToutEnMasm ] Tenté par le sujet ?http://perso.orange.fr/luce.yves/DIRECTX9.htmje me suis vu refuser mes sources du début par le serveur,ou alors j'ai fait une faus [API] - VirtualAlloc [ par Nowid50 ] Bonjour à tous !Voila je me sers de cette API pour stocker du code assembleur dans un fichier.Et j'aimerais savoir si je modifie le contenu (en utilis secteur boot sur CDs [ par sajaris ] Bonjour a tous, j'ai essayé quelques tutoriels sur la creation d'un secteur boot et d'un petit kernel (les exemple ne manque pas sur le net). Mon prob


Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales