IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Assembleur Intel avec NASM en mode protégé
Par Etienne Sauvage

Le , par Chevalier au taureau

0PARTAGES

8  0 
Bonjour,

Vous trouverez à cette adresse : http://esauvage.developpez.com /tutoriels/asm/assembleur-intel-avec-nasm/ un parcours du combattant, un cheminement de quelqu'un qui, partant d'à peu près rien, essaye d'arriver à pas beaucoup plus mais quand même.

Ce n'est pas vraiment un tutoriel parce que ça n'a pas d'objectif précis, ce n'est pas un cours car c'est riche en approximations. C'est plutôt le suivi d'un trappeur face à l'immensité canadienne.

Néanmoins, comme j'ai remarqué que visiblement et contre toute attente, ça intéresse des gens, je crée cette discussion afin de recueillir les retours éventuels.

Cordialement,

Le chevalier au taureau.

PS : Voir aussi les autres cours et tutoriels pour apprendre l’assembleur : http://asm.developpez.com/cours/
Vous avez lu gratuitement 29 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de E-Sh4rk
Membre à l'essai https://www.developpez.com
Le 29/04/2011 à 10:21
Je ne sais pas si je dois le signaler ici, mais j'ai noté une petite erreur sur cette page.

Dans le paragraphe VIII.1.a. L'architecture des premiers Personal Computers, je cite :

Cette architecture permet d'accéder à 2^20 octets de mémoire vive, plus ou moins un. Ca fait 1 gigaoctet.
Il est bien entendu que cela fait en réalité 1Mo, et que cette quantité de mémoire était largement suffisante aux besoins qui régissaient les premiers temps de cette architecture.

Bonne journée

PS : Félicitations pour l'initiative de ce tutorial (sujet peu traité de manière simple et exhaustive en français) et pour les qualités de rédaction qui le rendent très agréable à lire !
1  0 
Avatar de tpii44119
Membre à l'essai https://www.developpez.com
Le 03/05/2011 à 16:47
Amusant ce tutoriel. Un brin nostalgique. Cela me rappelle mon DUT et les cours d'assembleur Z80. Comme TP on avait à écrire des routines Entrée-Sortie (Affichage écran, Saisie clavier, lecture et affichage d'un secteur de disquette). En gros réécrire une petite partie de l'OS. C'était le début du PC et de MSDOS. En fonction de la compréhension de chacun une même routine pouvait tenir en 20 lignes ou 200 ! Il y avait un petit futé qui avait fait tenir ses programmes en 5 lignes : il se contentait de faire appel aux fonctions du DOS (il s'était procuré une documentation américaine explicitant ces fonctions !). Merci de ce moment de divertissement.
1  0 
Avatar de Matarc
Nouveau membre du Club https://www.developpez.com
Le 31/05/2011 à 11:59
Bonjour à tous !

Tout d'abord merci pour cet article, je n'ai fait que le feuilleter rapidement mais il a super bien fait, exactement ce que je recherchais !

J'ai une petite question cependant, j'ai vu sur le site de NASM que le logiciel est multiplateforme, notamment utilisable sous Linux et BSD.

Est ce que les codes fournis dans ton article sont utilisables sous d'autres OS ou est ce qu'un OS Windows est absolument indispensable ?

Le premier code qui me vient à l'esprit est le suivant :
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
org 0x0100 ; Adresse de début .COM
    ;Ecriture de la chaîne hello dans la console

mov ah, 0x9
mov dx, hello
int 0x21
ret
hello: db 'Bonjour papi.', 10, 13, '$'
Est ce que l'entête qui, d'après ce que j'ai compris, sera complété par NASM en fonction du système d'exploitation, fera également 256 octets sous Linux et BSD ou est ce qu'une autre valeur doit être utilisée afin de pouvoir exécuter le programme sous ces OS ?
Est ce qu'en dehors de ça il y d'autres choses qui pourraient posaient problème en terme de compatibilité ?

Cordialement
Matarc
1  0 
Avatar de Chevalier au taureau
Membre averti https://www.developpez.com
Le 31/05/2011 à 14:04
Bonjour,

Ne serait-ce qu'à cause de int 0x21, il s'agit d'un code DOS. Uniquement DOS. Il se trouve que Windows contient DOS quelque part, tout au moins jusqu'à la version Vista, et que par conséquent, ce code est exploitable sous Windows.
Tous les codes de l'article utilisant un système d'exploitation sont conçus sous Windows et ne peuvent fonctionner tels quels sous un autre système d'exploitation.
L'en-tête ne fera pas 256 octets sous un autre système d'exploitation, parce qu'il utilisera à coup sûr un autre format de fichiers exécutables. C'est d'ailleurs l'une des raisons pour lesquelles un programme Windows ne tourne pas sous Mac.
Pour Linux, il faut jouer avec les segments, et la directive org a moins de raisons d'être. De surcroît, il me semble me souvenir que la sortie de l'exécutable est manuelle.
Bref, la compatibilité est loin d'être garantie et ne saurait être trouvée avec ce simple code. C'est la gestion des segments et l'utilisation de bibliothèques multi-plateforme qui permet la compatibilité.

En espérant avoir été clair et répondu à la question,
1  0 
Avatar de afranck64
Membre éprouvé https://www.developpez.com
Le 19/12/2011 à 20:41
Citation Envoyé par Chevalier au taureau Voir le message
Oups ! Désolé.

Comme je n'ai pas de Windows 7 sous la main, il va falloir me donner un peu plus d'informations. Quel chapitre, quelles commandes, quel fichier, ce genre d'informations. Plus ce sera précis et mieux je pourrai chercher une solution.
Le tout premier programme, "Hello papi."
Code : Sélectionner tout
1
2
3
4
5
6
7
org 0x0100 ; Adresse de début .COM
;Ecriture de la chaîne hello dans la console
mov dx, hello
mov ah, 0x9
int 0x21
ret
hello: db 'Bonjour papi.', 10, 13, '$'
.
La compilation se produit sans soucis, mais l'OS ne parvient pas à exécuter le .COM obtenu
1  0 
Avatar de korn2kx
Candidat au Club https://www.developpez.com
Le 01/04/2012 à 18:48
Bonjour, je tenais tout d'abord à vous remercier pour toutes ces précieuses informations sur l'assembleur, le BIOS, etc...

Je suis votre "tutoriel" avec un grand intérêt.

J'en suis au chapitre IV, or je rencontre des difficultés:

Je suis sous windows 7 x64, donc bien évidemment dès le début, lorsque j'ai voulu exécuter un programme .com (16bit), windows m'a jeté avec un message explicite.

La solution qui fonctionnait jusque là, (attention ce n'est pas forcément la meilleure...), fut d'installer windows Virtual PC, et de créer un ordinateur virtuel sous windows XP.

Cette solution a fonctionné jusqu'au chapitre III inclus, mais je ne sais pourquoi, avec le code du chapitre IV j'ai le message d'erreur suivant :


Je pense donc que je vais me rabattre sur la solution "dosbox" que vous avez évoqué concernant windows Vista...

Sinon j'ai une question :
Dans le chapitre : IV.2. Le refacteur sonne toujours une paire de fois (refactoring)

Pour l'instruction LODSB, ne serait-ce pas plutôt l'équivalent de
MOV AL, [DS:SI] ; en gardant la syntaxe destination, source (intel)
INC SI

de même pour STOSB qui devient :
MOV [ES:DI], AL
INC DI

J'avoue que lorsque que j'ai lu le chapitre ce détail m'a perturbé.

Enfin encore merci!!!

Ps: si vous avez des choses à ajouter sur le sujet je serait ravi de pouvoir les lire...
1  0 
Avatar de Chevalier au taureau
Membre averti https://www.developpez.com
Le 04/04/2012 à 16:16
Bonjour,

Merci de vos compliments, mais n'en jetez plus, je pourrais les croire.

En effet, vous avez une interdiction d'accéder aux services vidéo du BIOS à partir de Vista. La machine virtuelle Windows ne restaure peut-être pas l'accès à ces services.

Vous m'avez tout l'air d'avoir repéré une coquille, que je m'en vais corriger de ce pas nonchalant (parce que là je suis un poil juste, en temps).

Vous trouverez la suite du tuto ici, ou bien les dernières versions, y compris celles en cours de développement

Au plaisir de vous lire,
1  0 
Avatar de Chevalier au taureau
Membre averti https://www.developpez.com
Le 05/12/2017 à 13:01
Et bien dans ce cas, il n'y en a pas. Tous les nombres sont représentés en binaire.
Par contre, la procédure d'affichage nombre_vers_chaine est, essentiellement, la conversion d'un nombre binaire en décimal.
1  0 
Avatar de SilverKen_8
En attente de confirmation mail https://www.developpez.com
Le 04/01/2018 à 16:07
Je vous mets un lien de documentation pour les interruptions MS-DOS qui m'a vraiment aidé car je l'ai lue en parallèle du tutoriel :
https://www.gladir.com/LEXIQUE/INTR/

Sur ce, passez une bonne journée
1  0 
Avatar de Chevalier au taureau
Membre averti https://www.developpez.com
Le 01/06/2018 à 16:12
JE : Jump if Equal, saute à l'adresse en paramètre si ZF est levé. on l'utilise souvent après une instruction CMP.
CMP pour CoMPare, fait la différence entre ses deux arguments et lève des drapeaux selon les résultats de cette différence.

@je viens du sud : un nombre est un nombre, il est le même quelque soit le système d'écriture utilisé. Comme système d'écriture, on utilise parfois le binaire, parfois l'hexadécimal, parfois le décimal. Mais le nombre reste le même. Ce n'est que la façon de l'écrire qui change. Ainsi, ax contient le nombre de pages de 16 ko. On multiplie donc ce nombre par 16 pour avoir le nombre de ko disponibles, selon la formule : nombre de pages x taille de la page = espace disponible.

Pour VESA, le code s'étant arrêté sans afficher d'autres choses, c'est que VESA n'est pas supporté par DOSBox:
Code : Sélectionner tout
1
2
    cmp al, 0x4F ; Si AL <> 0x4F, on n'a pas de VESA, donc fin.
    jne fin
1  0