Précédent   Forum du club des développeurs et IT Pro > Autres langages > Assembleur > x86 16-bits
x86 16-bits Architecture x86 16 bits et ses outils (assembleurs, debuggers, émulateurs...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 11/09/2011, 19h58   #1
romfox17
Nouveau Membre du Club
 
Homme Romain
Inscription : avril 2011
Messages : 60
Détails du profil
Informations personnelles :
Nom : Homme Romain
Âge : 21
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : avril 2011
Messages : 60
Points : 30
Points : 30
Par défaut Mes débuts en asm :p

Salut a tous,
Voila, programmant depuis quelques mois en C et m'interessant a l'informatique, il était obligatoire que je tombe la dedans est cela est fait.
Sous les conseils d'un amis j'ai installé DOS (émulé) et fasm, et c'est parti !

Alors je commences avec quelques petits programmes, mais j'aimerais bien pourvoir afficher par exemple le résultat d'une addition que je viens de faire...

Ou avec les chaines de caractères, par exemple j'ai le code suivant :

Code :
1
2
3
4
5
mov ah, 09h
mov dx, buff ; 
int 21h
...
buff db 10, 12 dup("$")
Seulement avec ce code j'affiche aussi les 2 1ers octets du buffer soit ce qui ne m'interesse pas. Donc je me dis facil, je fais :
Seulement là plus rien ne s'affiche...

Donc si quelqu'un avait des solutions a mes problèmes, je ne demande surtout pas de code mais quelques explications seraient les bienvenues.
Merci
romfox17 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2011, 22h16   #2
edfed
Membre chevronné
 
Avatar de edfed
 
être humain
Inscription : décembre 2007
Messages : 471
Détails du profil
Informations professionnelles :
Activité : être humain

Informations forums :
Inscription : décembre 2007
Messages : 471
Points : 619
Points : 619
buff db 10,12 dup $ est un non sens, surtout avec fasm.

si tu veux afficher une chaine, il faut une chaine à afficher, or, db 10,$,$,$,$,$,$,$,$,$,$,$,$ n'est pas du tout une chaine capable d'etre affichée par int21h.

le caractère $ indique la fin de chaine, et le caractère 10 indique un saut de ligne (LF)
donc, primo, avant de pouvoir afficher des nombres, il faut pouvoir afficher des lettres.

premiere chose à faire, constater qu'avec buffer db 'chaine',$, le mot chaine sera bien affiché à l'ecran.

ensuite, ecrire une ligne qui modifie le contenu de la chaine, par exemple:
avec un mov dword[buffer],'tour' le resultat affiché sera la chaine 'tourne' au lieu de 'chaine', car on modifié le premier dword de la chaine, soit 4 octets, soit 4 caractères.

ensuite, creer un programme qui affiche le contenu d'un registre en hexadecimal, en creant une chaine, ou directement avec le caractère dans le registre al.

allez, bon courage, ce n'est que le debut.
__________________
http://www.pending.me.uk/nmc/bla_1356091200.png
Vivement 21/12/2012
edfed est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/09/2011, 15h06   #3
romfox17
Nouveau Membre du Club
 
Homme Romain
Inscription : avril 2011
Messages : 60
Détails du profil
Informations personnelles :
Nom : Homme Romain
Âge : 21
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : avril 2011
Messages : 60
Points : 30
Points : 30
Merci, je me lance alors :p Par contre juste un petit truc : le buffer que je crée il est fait pour la fonction 0ah de l'int 21h , c'est pour cela que je fais buff db 10, 12 dup('$'). Et cela m'affiche mon texte mais avec 2 octets au début de la chaine, et donc j'ai droit a un symbole au début de mon texte. Et ce qui me frustre c'est que logiquement envoyer buff+2 a dx ça devrait envoyer l'adresse de mon buffer + 2 octets, soit supprimer le symbole au début de ma chaine a l'affichage, non ? Mais cela ne marche pas et ne m'affiche rien.
romfox17 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 09h15   #4
Forthman
Membre expérimenté
 
Avatar de Forthman
 
Homme François
conception mécanique
Inscription : janvier 2005
Messages : 330
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 37
Localisation : France, Tarn et Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : conception mécanique
Secteur : Industrie

Informations forums :
Inscription : janvier 2005
Messages : 330
Points : 532
Points : 532
Bonjour,

La fonction 09h de l'interruption 21h affiche une chaine terminée par "$"
et n'a besoin de rien d'autre (pas de longueur de chaine en début par exemple)
Donc aucune valeur n'est nécessaire en début de chaine.

Un truc comme ça marche parfaitement :
Tu es sur d'avoir bien initialisé le registre DS ?

a+ François
Forthman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 10h12   #5
romfox17
Nouveau Membre du Club
 
Homme Romain
Inscription : avril 2011
Messages : 60
Détails du profil
Informations personnelles :
Nom : Homme Romain
Âge : 21
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : avril 2011
Messages : 60
Points : 30
Points : 30
Comme je le disais, cette chaine est faite pour la fonction 0ah qui elle nécéssite une taille. Et lorsque j'affiche cette chaine, logiquement il y a les 2 1ers octets qui ne sont pas ma chaine, qui s'affichent ...
romfox17 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 13h41   #6
edfed
Membre chevronné
 
Avatar de edfed
 
être humain
Inscription : décembre 2007
Messages : 471
Détails du profil
Informations professionnelles :
Activité : être humain

Informations forums :
Inscription : décembre 2007
Messages : 471
Points : 619
Points : 619
il manque un gros bout de code, ça aide pour comprendre, car un petit fragment de code n'est pas significatif de l'ensemble.

quoi qu'il en soit, utiliser les interruptions dos pour afficher et triturer des chaines de caractères, c'est pas malin, ces fonctions sont super lentes.
__________________
http://www.pending.me.uk/nmc/bla_1356091200.png
Vivement 21/12/2012
edfed est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/09/2011, 15h57   #7
romfox17
Nouveau Membre du Club
 
Homme Romain
Inscription : avril 2011
Messages : 60
Détails du profil
Informations personnelles :
Nom : Homme Romain
Âge : 21
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : avril 2011
Messages : 60
Points : 30
Points : 30
Ba comme je disais dans mon 1er post, un amis m'a conseillé de commencer sous DOS donc je penses pas que y'ai autre chose.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
org 100h
 
mov ah, 0ah
mov dx, buff
int 21h
 
mov ah, 09h
mov dx, buff
int 21h
 
mov ax, 4c00h
int 21h
 
buff db 10, 12 dup('$')
Voila mon code entier. Il marche mais affiche la chaine entrée avec 2 octets au début, donc en général j'ai droit a un smiley ou autre symbol :p Et du coups c'est frustrant je me dis que j'arrive meme pas a me déplacer de X octets pour la lecture.
romfox17 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 19h59   #8
edfed
Membre chevronné
 
Avatar de edfed
 
être humain
Inscription : décembre 2007
Messages : 471
Détails du profil
Informations professionnelles :
Activité : être humain

Informations forums :
Inscription : décembre 2007
Messages : 471
Points : 619
Points : 619
un petit coup d'oeil ici:
http://docs.huihoo.com/help-pc/int-int_21.html
http://docs.huihoo.com/help-pc/int-int_21_a.html

l'entrée au clavier sert à communiquer avec une fonction qui va convertir en données ce que le clavier envoie.

si le but est de faire une addition avec le clavier, comme pa exemple en ecrivant ceci:
123+432
et en tappant entrée, alors ton code est très incomplet.

tout ce que tu vas pouvoir afficher, ça sera le buffer du clavier DOS.
le premier octet du buffer indique la taille du buffer.
le second indique le nombre d'octets retournés par int21h_a
le reste contient le buffer clavier DOS, à savoir des caractères ascii correspondant aux touches et la page de code du systeme.

si tu veux calculer, il va te falloir une fonction pour parser la chaine et la convertir en operations que le programme pourra interpreter.
__________________
http://www.pending.me.uk/nmc/bla_1356091200.png
Vivement 21/12/2012
edfed est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/09/2011, 20h51   #9
romfox17
Nouveau Membre du Club
 
Homme Romain
Inscription : avril 2011
Messages : 60
Détails du profil
Informations personnelles :
Nom : Homme Romain
Âge : 21
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : avril 2011
Messages : 60
Points : 30
Points : 30
Non sur ce code je voulais juste afficher la chaine sans les 2 premiers octets. Donc je me disais qu'un simple mov dx, buff+2 marcherait mais non. Et c'est cela le but de ma question. Pour ce qui est des calculs de nombre je ne m'y suis pas encore mis.
romfox17 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 07h55   #10
Forthman
Membre expérimenté
 
Avatar de Forthman
 
Homme François
conception mécanique
Inscription : janvier 2005
Messages : 330
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 37
Localisation : France, Tarn et Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : conception mécanique
Secteur : Industrie

Informations forums :
Inscription : janvier 2005
Messages : 330
Points : 532
Points : 532
Bonjour,

Je me suis permis de modifier un peu ton code pour faire des essais...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
org 100h
 
debut:
 
; saute une ligne pour plus de lisibilité
mov ah, 02h
mov dl,10
int 21h
mov ah, 02h
mov dl,13
int 21h
 
; saisie dans le buffer
mov ah, 0Ah
mov dx, buff
int 21h
 
; saute une ligne pour plus de lisibilité
mov ah, 02h
mov dl,10
int 21h
mov ah, 02h
mov dl,13
int 21h
 
; affichage du buffer
mov ah, 09h
mov dx, buff+2
int 21h
 
; Attend une touche clavier, si <> Echap (code 27) on boucle
mov ah, 07h
int 21h
cmp al,27
jnz debut
 
; fin du prog
mov ax, 4c00h
int 21h
 
buff db 11,0, 12 dup '$'
J'ai modifié l'initialisation des données :
Code :
buff db 10, 12 dup('$')
J'ai remplacé 10 par 11 car le buffer se terminera par le code 13 (touche enter)

Il manquait le 2eme octet du buffer (longueur enregistrée) que j'initialise à 0

Par contre, il faudrait remettre la chaine à "$$$$$$$$$$" avant chaque saisie
sinon comme à la fin de la saisie la fonction 0Ah place un retour chariot (code 13)
à la fin de la chaine, ça fout le bordel à l'affichage.

par exemple :
Entrée de "1234567890"
Affichage : "1234567890"
Entrée de "AZE"
Affichage : "567890"

En fait, dans lors de la 2eme saisie, "AZE" a bien été affiché, mais comme
il y a un code ASCII 13 après, le curseur revient en début de chaine
pour afficher 567890 et enfin arrêter l'affichage au "$"
Le contenu de buff+2 = "AZE*567890$" (j'ai remplacé le code 13 par *)

Comme l'a dit Edfed, tu devrais éviter d'utiliser les interruption du DOS.
Elles sont lentes, et comme tu peux le constater, pas toujours très compatibles entre elles

a+ François
Forthman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 10h27   #11
Forthman
Membre expérimenté
 
Avatar de Forthman
 
Homme François
conception mécanique
Inscription : janvier 2005
Messages : 330
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 37
Localisation : France, Tarn et Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : conception mécanique
Secteur : Industrie

Informations forums :
Inscription : janvier 2005
Messages : 330
Points : 532
Points : 532
Je pensais à un truc tout bête/facile
Plutôt que de lire la chaine en format ASCII$, tu peux la lire comme elle
a été enregistrée cad en tenant compte de la longueur dans le buffer.

un exemple de code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
mov cl,[buff+1] ; longueur dans CL
cmp cl,0           ; ça c'est au cas ou il n'y aurait rien dans le buffer
jz rien_a_afficher ; sinon ça va afficher 256 caractère
mov si,buff+2 ; SI pointe le début de la chaine
boucle_affiche:
mov ah,02h ; fonction 02h = sortie de caractère
mov dl,[si] ; DL = caractère pointé par SI
int 21h
inc si ; SI = SI+1 pour pointer l'octet suivant
dec cl ; CL = CL-1
jnz boucle_affiche ; si CL = 0 on passe à la suite
rien_a_afficher:
a+ François
Forthman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 07h32   #12
romfox17
Nouveau Membre du Club
 
Homme Romain
Inscription : avril 2011
Messages : 60
Détails du profil
Informations personnelles :
Nom : Homme Romain
Âge : 21
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : avril 2011
Messages : 60
Points : 30
Points : 30
Salut et merci tous de vos réponses, je met le sujet en résolu

Pour info j'en ai eu mare de DOS émulé et tout ça :p Je suis passé à nasm en 32 bits sous linux et je m'amuse autrement Les appels systèmes c'est sympa ! :p

Et par dessus tout maintenant les codes asm que je compile ont une entête ELF. Du coups la syntaxe nasm me plait vachement car je retrouve mes sections et tout ce que je connais plus ou moins de la structure d'un programme. Comparé a DOS (qui pour moi est rustique, ne me lynchez pas, je suis née en 1992 xD), c'est le paradis je m'y retrouve la !
romfox17 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h23.


 
 
 
 
Partenaires

Hébergement Web