Je me lance dans l'assembleur sous linux et j'ai un petit problème.
Je tape ce programme :
section .text
global _start
msg db 'Hello, world',0xa
len equ $ - msg
_start:
mov edx, len
mov ecx, msg
mov ebx, 1
mov eax, 4
int 0x80
mov eax, 1
int 0x80
Ensuite, je compile et link mais j'ai une erreur de segmentation à
l'éxécution.
J'ai aussi remarqué que lorsque j'affichais certaines manpage j'avais ce
même type d'erreur.
J'ai bien entendu une gentoo portée par un noyau : 2.6.12-gentoo-r3
Est ce que quelqu'un saurait me dire à quoi ça peut être du, et ensuite,
une piste vers la solution ou même la dite solution à ce problème ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Hubert Mercier
Mes cours d'asm sont très très très loin... (et c'était sous DOS et non Linux, à l'époque). Ne me tenez pas rigueur de dire une bêtise donc.
Mais n'avez-vous pas oublié de stopper votre programme (int 19 si mes souvenirs sont bons) ? Sinon l'assembleur va continuer à interpréter ce qui suit dans la mémoire après vos commandes d'affichage... Et qui n'a probablement aucun sens (ce qui suit, pas vos commande, hein ^^)..
Bon courage en tous cas. Est-il indiscret de vous demander pourquoi vous vous intéressez à l'ASM ?
youshe a écrit :
Bonjour,
Je me lance dans l'assembleur sous linux et j'ai un petit problème. Je tape ce programme :
section .text global _start
msg db 'Hello, world',0xa len equ $ - msg
_start:
mov edx, len mov ecx, msg mov ebx, 1 mov eax, 4 int 0x80
mov eax, 1 int 0x80
Ensuite, je compile et link mais j'ai une erreur de segmentation à l'éxécution. J'ai aussi remarqué que lorsque j'affichais certaines manpage j'avais ce même type d'erreur. J'ai bien entendu une gentoo portée par un noyau : 2.6.12-gentoo-r3
Est ce que quelqu'un saurait me dire à quoi ça peut être du, et ensuite, une piste vers la solution ou même la dite solution à ce problème ?
Merci :D
Fred
-- mailing list
Mes cours d'asm sont très très très loin... (et c'était sous DOS et non
Linux, à l'époque). Ne me tenez pas rigueur de dire une bêtise donc.
Mais n'avez-vous pas oublié de stopper votre programme (int 19 si mes
souvenirs sont bons) ? Sinon l'assembleur va continuer à interpréter ce
qui suit dans la mémoire après vos commandes d'affichage... Et qui n'a
probablement aucun sens (ce qui suit, pas vos commande, hein ^^)..
Bon courage en tous cas. Est-il indiscret de vous demander pourquoi vous
vous intéressez à l'ASM ?
youshe a écrit :
Bonjour,
Je me lance dans l'assembleur sous linux et j'ai un petit problème.
Je tape ce programme :
section .text
global _start
msg db 'Hello, world',0xa
len equ $ - msg
_start:
mov edx, len
mov ecx, msg
mov ebx, 1
mov eax, 4
int 0x80
mov eax, 1
int 0x80
Ensuite, je compile et link mais j'ai une erreur de segmentation à
l'éxécution.
J'ai aussi remarqué que lorsque j'affichais certaines manpage j'avais ce
même type d'erreur.
J'ai bien entendu une gentoo portée par un noyau : 2.6.12-gentoo-r3
Est ce que quelqu'un saurait me dire à quoi ça peut être du, et ensuite,
une piste vers la solution ou même la dite solution à ce problème ?
Mes cours d'asm sont très très très loin... (et c'était sous DOS et non Linux, à l'époque). Ne me tenez pas rigueur de dire une bêtise donc.
Mais n'avez-vous pas oublié de stopper votre programme (int 19 si mes souvenirs sont bons) ? Sinon l'assembleur va continuer à interpréter ce qui suit dans la mémoire après vos commandes d'affichage... Et qui n'a probablement aucun sens (ce qui suit, pas vos commande, hein ^^)..
Bon courage en tous cas. Est-il indiscret de vous demander pourquoi vous vous intéressez à l'ASM ?
youshe a écrit :
Bonjour,
Je me lance dans l'assembleur sous linux et j'ai un petit problème. Je tape ce programme :
section .text global _start
msg db 'Hello, world',0xa len equ $ - msg
_start:
mov edx, len mov ecx, msg mov ebx, 1 mov eax, 4 int 0x80
mov eax, 1 int 0x80
Ensuite, je compile et link mais j'ai une erreur de segmentation à l'éxécution. J'ai aussi remarqué que lorsque j'affichais certaines manpage j'avais ce même type d'erreur. J'ai bien entendu une gentoo portée par un noyau : 2.6.12-gentoo-r3
Est ce que quelqu'un saurait me dire à quoi ça peut être du, et ensuite, une piste vers la solution ou même la dite solution à ce problème ?
Merci :D
Fred
-- mailing list
youshe
Bonsoir, je ne vois pas mon propre message, certainement du à des problèmes d'emails (j'ai changé d'email pour cette liste donc...), donc si mon mail apparait deux fois, je m'en excuse... :)
Mes cours d'asm sont très très très loin... (et c'était sous DOS et non Linux, à l'époque). Ne me tenez pas rigueur de dire une bêtise donc.
Je n'ai pas osé touché à l'asm sous DOS en fait... Je me suis dit, pourquoi ne pas attaquer directement sous linux ?
Mais n'avez-vous pas oublié de stopper votre programme (int 19 si mes souvenirs sont bons) ? Sinon l'assembleur va continuer à interpréter ce qui suit dans la mémoire après vos commandes d'affichage... Et qui n'a probablement aucun sens (ce qui suit, pas vos commande, hein ^^)..
En fait, pour ce qui est d'arrêter le programme, on utilise l'appel système :
mov eax, 1 int 0x80
En fait, de ce coté là, linux semble être très différent que sous DOS/WINDOWS, on utilise simplement l'int 80h permettant d'accéder aux appels systèmes.
Bon courage en tous cas.
Merci, c'est gentil, je pense que j'en aurai besoin :)
Est-il indiscret de vous demander pourquoi vous vous intéressez à l'ASM ?
En fait, je ne saurai répondre exactement, peut être parce que je suis un peu (beaucoup ?) kamikase, mais surtout parce que j'aime vraiment comprendre les choses du fond et je pense que l'asm, étant de très bas niveau (on aura du mal à faire plus bas...), je pense que c'est une approche assez intéressante poru ce genre de choses. Et puis, je me suis toujorus dit que je devais apprendre l'assembleur un jour ou l'autre simplement pour m'amuser et pouvoir en discuter en connaissance de cause avec des amis qui eux sont accroc à ce langage (par exemple un membre du projet skan (skan.developpez.com), projet visant à contruire un noyau/OS entièrement en assembleur. Dans l'optique de mes projets du moment, je peux vous dire par exemple m'intéresser à la théorie des langages et plus généralement à l'informatique théorique, aux OS aussi bien développement que théorie, à la programmation système sous linux ainsi qu'au projet hurd. Ces petits exemples peuvent peut être vous donner une vision plus détaillée de mes petits rêves du moment... En fait, je fais ça plus par amusement et curiosité que par soucis d'efficassité :)
Merci pour votre aide...
Fred
P.S. la doc que j'ai utilisée pour ce programme est celle disposée sur le site linuxassembly.org, plus exactement ici : http://asm.sourceforge.net/intro/hello.html Peut être qu'une version en français existe sur le net, je n'ai pas osé chercher :)
-- mailing list
Bonsoir, je ne vois pas mon propre message, certainement du à des
problèmes d'emails (j'ai changé d'email pour cette liste donc...), donc
si mon mail apparait deux fois, je m'en excuse... :)
Mes cours d'asm sont très très très loin... (et c'était sous DOS et
non Linux, à l'époque). Ne me tenez pas rigueur de dire une bêtise
donc.
Je n'ai pas osé touché à l'asm sous DOS en fait... Je me suis dit,
pourquoi ne pas attaquer directement sous linux ?
Mais n'avez-vous pas oublié de stopper votre programme (int 19 si mes
souvenirs sont bons) ? Sinon l'assembleur va continuer à interpréter
ce qui suit dans la mémoire après vos commandes d'affichage... Et qui
n'a probablement aucun sens (ce qui suit, pas vos commande, hein
^^)..
En fait, pour ce qui est d'arrêter le programme, on utilise l'appel
système :
mov eax, 1
int 0x80
En fait, de ce coté là, linux semble être très différent que sous
DOS/WINDOWS, on utilise simplement l'int 80h permettant d'accéder aux
appels systèmes.
Bon courage en tous cas.
Merci, c'est gentil, je pense que j'en aurai besoin :)
Est-il indiscret de vous demander pourquoi vous vous intéressez à
l'ASM ?
En fait, je ne saurai répondre exactement, peut être parce que je suis
un peu (beaucoup ?) kamikase, mais surtout parce que j'aime vraiment
comprendre les choses du fond et je pense que l'asm, étant de très bas
niveau (on aura du mal à faire plus bas...), je pense que c'est une
approche assez intéressante poru ce genre de choses. Et puis, je me suis
toujorus dit que je devais apprendre l'assembleur un jour ou l'autre
simplement pour m'amuser et pouvoir en discuter en connaissance de cause
avec des amis qui eux sont accroc à ce langage (par exemple un membre du
projet skan (skan.developpez.com), projet visant à contruire un
noyau/OS entièrement en assembleur.
Dans l'optique de mes projets du moment, je peux vous dire par exemple
m'intéresser à la théorie des langages et plus généralement à
l'informatique théorique, aux OS aussi bien développement que théorie, à
la programmation système sous linux ainsi qu'au projet hurd. Ces petits
exemples peuvent peut être vous donner une vision plus détaillée de mes
petits rêves du moment...
En fait, je fais ça plus par amusement et curiosité que par soucis
d'efficassité :)
Merci pour votre aide...
Fred
P.S. la doc que j'ai utilisée pour ce programme est celle disposée sur
le site linuxassembly.org, plus exactement ici :
http://asm.sourceforge.net/intro/hello.html
Peut être qu'une version en français existe sur le net, je n'ai pas osé
chercher :)
Bonsoir, je ne vois pas mon propre message, certainement du à des problèmes d'emails (j'ai changé d'email pour cette liste donc...), donc si mon mail apparait deux fois, je m'en excuse... :)
Mes cours d'asm sont très très très loin... (et c'était sous DOS et non Linux, à l'époque). Ne me tenez pas rigueur de dire une bêtise donc.
Je n'ai pas osé touché à l'asm sous DOS en fait... Je me suis dit, pourquoi ne pas attaquer directement sous linux ?
Mais n'avez-vous pas oublié de stopper votre programme (int 19 si mes souvenirs sont bons) ? Sinon l'assembleur va continuer à interpréter ce qui suit dans la mémoire après vos commandes d'affichage... Et qui n'a probablement aucun sens (ce qui suit, pas vos commande, hein ^^)..
En fait, pour ce qui est d'arrêter le programme, on utilise l'appel système :
mov eax, 1 int 0x80
En fait, de ce coté là, linux semble être très différent que sous DOS/WINDOWS, on utilise simplement l'int 80h permettant d'accéder aux appels systèmes.
Bon courage en tous cas.
Merci, c'est gentil, je pense que j'en aurai besoin :)
Est-il indiscret de vous demander pourquoi vous vous intéressez à l'ASM ?
En fait, je ne saurai répondre exactement, peut être parce que je suis un peu (beaucoup ?) kamikase, mais surtout parce que j'aime vraiment comprendre les choses du fond et je pense que l'asm, étant de très bas niveau (on aura du mal à faire plus bas...), je pense que c'est une approche assez intéressante poru ce genre de choses. Et puis, je me suis toujorus dit que je devais apprendre l'assembleur un jour ou l'autre simplement pour m'amuser et pouvoir en discuter en connaissance de cause avec des amis qui eux sont accroc à ce langage (par exemple un membre du projet skan (skan.developpez.com), projet visant à contruire un noyau/OS entièrement en assembleur. Dans l'optique de mes projets du moment, je peux vous dire par exemple m'intéresser à la théorie des langages et plus généralement à l'informatique théorique, aux OS aussi bien développement que théorie, à la programmation système sous linux ainsi qu'au projet hurd. Ces petits exemples peuvent peut être vous donner une vision plus détaillée de mes petits rêves du moment... En fait, je fais ça plus par amusement et curiosité que par soucis d'efficassité :)
Merci pour votre aide...
Fred
P.S. la doc que j'ai utilisée pour ce programme est celle disposée sur le site linuxassembly.org, plus exactement ici : http://asm.sourceforge.net/intro/hello.html Peut être qu'une version en français existe sur le net, je n'ai pas osé chercher :)
-- mailing list
Frederik Deweerdt
Le 21/07/05 21:18 +0200, youshe écrivit:
Bonjour,
Salut,
section .text
Ca devrait être section .data, puisque ce sont tes données
global _start
msg db 'Hello, world',0xa
^^^^^ |--------------------------------| | 0xa c'est fin de ligne, il te faut plutot 0, fin de chaîne
len equ $ - msg
section .text --> ici, c'est le début du programme
_start:
mov edx, len mov ecx, msg mov ebx, 1 mov eax, 4 int 0x80
mov eax, 1 int 0x80
J'ai aussi remarqué que lorsque j'affichais certaines manpage j'avais ce même type d'erreur.
Je dirais que c'est un problème différent, ta RAM se porte bien?
A+ Fred
-- o---------------------------------------------o | http://open-news.net : l'info alternative | | Tech - Sciences - Politique - International | o---------------------------------------------o
-- mailing list
Le 21/07/05 21:18 +0200, youshe écrivit:
Bonjour,
Salut,
section .text
Ca devrait être section .data, puisque ce sont tes données
global _start
msg db 'Hello, world',0xa
^^^^^
|--------------------------------|
|
0xa c'est fin de ligne, il te faut plutot 0, fin de chaîne
len equ $ - msg
section .text --> ici, c'est le début du programme
_start:
mov edx, len
mov ecx, msg
mov ebx, 1
mov eax, 4
int 0x80
mov eax, 1
int 0x80
J'ai aussi remarqué que lorsque j'affichais certaines manpage j'avais ce
même type d'erreur.
Je dirais que c'est un problème différent, ta RAM se porte bien?
A+
Fred
--
o---------------------------------------------o
| http://open-news.net : l'info alternative |
| Tech - Sciences - Politique - International |
o---------------------------------------------o
Ca devrait être section .data, puisque ce sont tes données
global _start
msg db 'Hello, world',0xa
^^^^^ |--------------------------------| | 0xa c'est fin de ligne, il te faut plutot 0, fin de chaîne
len equ $ - msg
section .text --> ici, c'est le début du programme
_start:
mov edx, len mov ecx, msg mov ebx, 1 mov eax, 4 int 0x80
mov eax, 1 int 0x80
J'ai aussi remarqué que lorsque j'affichais certaines manpage j'avais ce même type d'erreur.
Je dirais que c'est un problème différent, ta RAM se porte bien?
A+ Fred
-- o---------------------------------------------o | http://open-news.net : l'info alternative | | Tech - Sciences - Politique - International | o---------------------------------------------o
-- mailing list
Pierre MAHOT
> > section .text Ca devrait être section .data, puisque ce sont tes données
Le segmentation fault se produit quand le programme accede à une zone mémoire qu'il n'a pas le droit d'accéder. Je pense effectivement que cette modif devrait résoudre ton problème.
D'autre part par simple curiosité: laquelle de tes instructions est sensée afficher le message?
Pour les manpages, tu remarquera qu'il n'y a pas forcément que man qui peut planter avec ce type d'erreur. Le "seg-fault" le plus courant est l'acces à un pointeur null en C, ce qui peut être tres vicieux lorsque tu travaille sur des structures de données complexes.
-- Pierre
-- mailing list
> > section .text
Ca devrait être section .data, puisque ce sont tes données
Le segmentation fault se produit quand le programme accede à une zone
mémoire qu'il n'a pas le droit d'accéder. Je pense effectivement que
cette modif devrait résoudre ton problème.
D'autre part par simple curiosité: laquelle de tes instructions est
sensée afficher le message?
Pour les manpages, tu remarquera qu'il n'y a pas forcément que man qui
peut planter avec ce type d'erreur. Le "seg-fault" le plus courant est
l'acces à un pointeur null en C, ce qui peut être tres vicieux lorsque
tu travaille sur des structures de données complexes.
> > section .text Ca devrait être section .data, puisque ce sont tes données
Le segmentation fault se produit quand le programme accede à une zone mémoire qu'il n'a pas le droit d'accéder. Je pense effectivement que cette modif devrait résoudre ton problème.
D'autre part par simple curiosité: laquelle de tes instructions est sensée afficher le message?
Pour les manpages, tu remarquera qu'il n'y a pas forcément que man qui peut planter avec ce type d'erreur. Le "seg-fault" le plus courant est l'acces à un pointeur null en C, ce qui peut être tres vicieux lorsque tu travaille sur des structures de données complexes.
-- Pierre
-- mailing list
Frederik Deweerdt
Le 22/07/05 11:39 +0200, Pierre MAHOT écrivit:
D'autre part par simple curiosité: laquelle de tes instructions est sensée afficher le message?
C'est le int 0x80 avec eax = 4 : ça appelle sys_write de la manière suivante: write(1, msg, len); // 1 == stdout
A+ Fred
-- o---------------------------------------------o | http://open-news.net : l'info alternative | | Tech - Sciences - Politique - International | o---------------------------------------------o
-- mailing list
Le 22/07/05 11:39 +0200, Pierre MAHOT écrivit:
D'autre part par simple curiosité: laquelle de tes instructions est
sensée afficher le message?
C'est le int 0x80 avec eax = 4 : ça appelle sys_write de la manière suivante:
write(1, msg, len); // 1 == stdout
A+
Fred
--
o---------------------------------------------o
| http://open-news.net : l'info alternative |
| Tech - Sciences - Politique - International |
o---------------------------------------------o
D'autre part par simple curiosité: laquelle de tes instructions est sensée afficher le message?
C'est le int 0x80 avec eax = 4 : ça appelle sys_write de la manière suivante: write(1, msg, len); // 1 == stdout
A+ Fred
-- o---------------------------------------------o | http://open-news.net : l'info alternative | | Tech - Sciences - Politique - International | o---------------------------------------------o
-- mailing list
youshe
> > > section .text > Ca devrait être section .data, puisque ce sont tes données
Le segmentation fault se produit quand le programme accede à une zone mémoire qu'il n'a pas le droit d'accéder. Je pense effectivement que cette modif devrait résoudre ton problème.
Effectivement, cette modification résoud bien le problème.
D'autre part par simple curiosité: laquelle de tes instructions est sensée afficher le message?
Donc d'après le tutoriel (et je le comprend aussi comme ça, l'affichage du message se fait avec l'appel se fait grace à :
mov edx, len ; longueur du message mov ecx, msg ; message à afficher mov ebx, 1 ; file descriptor (stdout)* mov eax, 4 ;n° d'appel système, ici 4 pour afficher msg int 0x80
* pourquoi passer 1 à ebx, là, je ne sais pas trop encore, mais je pense que c'est pour choisir l'endoit où envoyer le message, sortie standard, ou un autre périférique...
Pour les manpages, tu remarquera qu'il n'y a pas forcément que man qui peut planter avec ce type d'erreur. Le "seg-fault" le plus courant est l'acces à un pointeur null en C, ce qui peut être tres vicieux lorsque tu travaille sur des structures de données complexes.
A mon avis, ça vient peut être du fait qu'un programme utile à man a été mal compilé... J'ai normalent un emerge -e world qui devrait arriver d'ici peu, ça devrait pouvoir corriger le problème je pense...
Et pour répondre à la question de Frederik, je ne pense pas que ça vienne de la RAM étant donné que je n'ai eu que ce problème, avec gentoo exclusivement. J'ai eu aussi un windows d'installé ainsi que du FreeBSD, sans problèmes semblant provenir de la mémoire vive...
En tous cas, merci pour vos réponses..;
Fred aussi
-- mailing list
> > > section .text
> Ca devrait être section .data, puisque ce sont tes données
Le segmentation fault se produit quand le programme accede à une zone
mémoire qu'il n'a pas le droit d'accéder. Je pense effectivement que
cette modif devrait résoudre ton problème.
Effectivement, cette modification résoud bien le problème.
D'autre part par simple curiosité: laquelle de tes instructions est
sensée afficher le message?
Donc d'après le tutoriel (et je le comprend aussi comme ça, l'affichage
du message se fait avec l'appel se fait grace à :
mov edx, len ; longueur du message
mov ecx, msg ; message à afficher
mov ebx, 1 ; file descriptor (stdout)*
mov eax, 4 ;n° d'appel système, ici 4 pour afficher msg
int 0x80
* pourquoi passer 1 à ebx, là, je ne sais pas trop encore, mais je pense
que c'est pour choisir l'endoit où envoyer le message, sortie standard,
ou un autre périférique...
Pour les manpages, tu remarquera qu'il n'y a pas forcément que man qui
peut planter avec ce type d'erreur. Le "seg-fault" le plus courant est
l'acces à un pointeur null en C, ce qui peut être tres vicieux lorsque
tu travaille sur des structures de données complexes.
A mon avis, ça vient peut être du fait qu'un programme utile à man a été
mal compilé... J'ai normalent un emerge -e world qui devrait arriver
d'ici peu, ça devrait pouvoir corriger le problème je pense...
Et pour répondre à la question de Frederik, je ne pense pas que ça
vienne de la RAM étant donné que je n'ai eu que ce problème, avec
gentoo exclusivement. J'ai eu aussi un windows d'installé ainsi que du
FreeBSD, sans problèmes semblant provenir de la mémoire vive...
> > > section .text > Ca devrait être section .data, puisque ce sont tes données
Le segmentation fault se produit quand le programme accede à une zone mémoire qu'il n'a pas le droit d'accéder. Je pense effectivement que cette modif devrait résoudre ton problème.
Effectivement, cette modification résoud bien le problème.
D'autre part par simple curiosité: laquelle de tes instructions est sensée afficher le message?
Donc d'après le tutoriel (et je le comprend aussi comme ça, l'affichage du message se fait avec l'appel se fait grace à :
mov edx, len ; longueur du message mov ecx, msg ; message à afficher mov ebx, 1 ; file descriptor (stdout)* mov eax, 4 ;n° d'appel système, ici 4 pour afficher msg int 0x80
* pourquoi passer 1 à ebx, là, je ne sais pas trop encore, mais je pense que c'est pour choisir l'endoit où envoyer le message, sortie standard, ou un autre périférique...
Pour les manpages, tu remarquera qu'il n'y a pas forcément que man qui peut planter avec ce type d'erreur. Le "seg-fault" le plus courant est l'acces à un pointeur null en C, ce qui peut être tres vicieux lorsque tu travaille sur des structures de données complexes.
A mon avis, ça vient peut être du fait qu'un programme utile à man a été mal compilé... J'ai normalent un emerge -e world qui devrait arriver d'ici peu, ça devrait pouvoir corriger le problème je pense...
Et pour répondre à la question de Frederik, je ne pense pas que ça vienne de la RAM étant donné que je n'ai eu que ce problème, avec gentoo exclusivement. J'ai eu aussi un windows d'installé ainsi que du FreeBSD, sans problèmes semblant provenir de la mémoire vive...