Nasm sous linux

Y’a a-t-il des boss en assembleurs ici ? De préférence Nasm sous linux
car je galère pour faire des trucs simples comme une lecture au clavier
:

_lecture:
push	ebp

mov 	ebp, esp



mov 	eax,3   		; syscall (read)

    mov 	ebx,[ebp+8] 		; file descriptor

mov 	ecx,[ebp+12]	 	; buffer

mov 	edx,[ebp+16]		; taille

int 	0x80



mov 	esp,ebp

pop 	ebp

ret

Et ca ne marce pas, je vais attendre d’avoir une réponse avant de détailler plus.
Ce message a été édité par ZGoblin le 07/01/2004

du fin fond de ma memoire de programmeur de COM :

  • verifie que tu appels le bon service de ton interuption : es-tu sur que c’est 3 ? est-ce que ca ne saurait pas 0x3 ?
  • sinon, debugger et verifie que tes donnees son bonnes et bons endroit…
  • et puis je suis pas convaincu de ton push

[quote]ebp/mov ebp,esp
Si tes parametres sont sur la pile : pop les ou accedes y en esp+/-un truc, 
2 dernieres chose : verifie que la pile est dans le bon sens : selon l’os, et le CPU, ta pile va etre montante ou descendant, donc a acceder en stackpointer+n ou en stackpointer-n…
et sinon un dernier truc : passe 0x11111111 0x22222222 et 0x33333333 (enfin des valeurs bien batos que tu pourras facilement reconnaitre quoi) comme parametres, et verifie qu’ils sont bien dans le bonne ordre dans ton code.

Voila ce a quoi je peux penser sans en savoir plus sur l’os ni sur la position de ton code dans la vrais vie

Merci d’avoir essayé de m’aider Count, mon colloc a finallement trouvé
le problème, le code que je t’ai fourni est bon, il s’agissait de la
déclaration du buffer que je fournissait en paramètre, celui-ci n’était pas dans
la bonne section.

Vu le faible nombre de programmeurs ASM, qui se divisent entre TASM,
MASM, NASM, je ne peux compter que sur moi même pour des problèmes
aussi pointu.

Bah… on doit bien etre 2/3 sur le forums avec un minimum de connaissance… mais c’est vrais que le coup de la section, sans avoir le code complets sous les yeux : fallait y aller pour le trouver

En plus, dans ce genre de cas : il y a enaurmement de choses qui dependent de ton OS ( genre les sections par examples… ) et je dois avouer que l’asm sous linusque : j’en ai jamais fait !

Enfin si tu en as d’autre hesite pas

Moi j’ai utilisé TASM, MASM et NASM (dos, windows, linux), donc tu peux poser des questions, par contre :

1/ pense à nous donner le code en entier autant que possible (ben oui, sinon on peut pas faire grand chose dans ce genre de cas tordu)
2/ pense à donner le contexte complet (en assembleur, le contexte est vital, comme la carte du même nom)

Sinon je suis surpris que les interruptions fonctionnent sous linux, je pensais que tout était joliment wrappé par l’OS comme il se doit, d’autant plus qu’avec le mode protégé et tout ça… Remarque, je dis des bétises : linux doit installer ses propres interruptions pour faire ça, mais je n’en vois pas l’interet, des fonctions seraient beaucoup plus logiques et faciles d’utilisation )
Ce message a été édité par tuo le 08/01/2004

[quote](note pour c0unt0 : “3” et “0x3” c’est strictement identique hein )[/quote]ok

1…
2…
3…

TUEEEEEZZZ MOIIIIIIIIII…

[quote]Sinon
je suis surpris que les interruptions fonctionnent sous linux, je
pensais que tout était joliment wrappé par l’OS comme il se doit,
d’autant plus qu’avec le mode protégé et tout ça… Remarque, je dis
des bétises : linux doit installer ses propres interruptions pour faire
ça, mais je n’en vois pas l’interet, des fonctions seraient beaucoup
plus logiques et faciles d’utilisation
Ce message a été édité par tuo le 08/01/2004[/quote]

L’int 80 est utilisée par linux pour tous les appels systèmes, c’est à dire toutes les fonctions implémentées par le noyau mais qui sont accessibles à partir d’un programme utilisateur. Je sais pas pourquoi c’est implémenté de cette façon, mais en tout cas un simple appel de fonction n’aurait probablement pas suffit car lors d’un appel système, il y a changement de mode de privilège (usermode->kernelmode)

C’est aussi int 80 sur windows;
Sinon petite question, quelle est la différence entre TASM, MASM et NASM?
dos, windows, linux

Ben TASM c’était l’assembleur de Borland. MASM celui de Microsoft. Et NASM ben un compilo gratuit qui tourne sur pleins de plateformes x86.

C’est un peu comme demander la différence entre 2 compilos C ou C++ ça : c’est pareil, mais en différent Sauf que les compilateurs ASM ont généralement des points de syntaxe qui leur sont propres, histoire de complexifier un peu le tout

[quote]Moi j’ai utilisé TASM, MASM et NASM (dos, windows, linux), donc tu peux poser des questions, par contre :

1/
pense à nous donner le code en entier autant que possible (ben oui,
sinon on peut pas faire grand chose dans ce genre de cas tordu)
2/ pense à donner le contexte complet (en assembleur, le contexte est vital, comme la carte du même nom)

Sinon
je suis surpris que les interruptions fonctionnent sous linux, je
pensais que tout était joliment wrappé par l’OS comme il se doit,
d’autant plus qu’avec le mode protégé et tout ça… Remarque, je dis
des bétises : linux doit installer ses propres interruptions pour faire
ça, mais je n’en vois pas l’interet, des fonctions seraient beaucoup
plus logiques et faciles d’utilisation

Et
sinon, pourquoi tu fais tout en ASM dis ? Moi sous linux j’avais fait
un mélange C/ASM comme ça hop ça passait nickel, et mon ASM était
cross-OS (sur processeur x86 évidemment)

(note pour c0unt0 : “3” et “0x3” c’est strictement identique hein )
Ce message a été édité par tuo le 08/01/2004[/quote]Je
fais un programme en ASM car c’est un projet d’assembleur, j’avais
penssé à le faire en C avec un ‘gcc -S file.c’ mais je pense que ca se
serait vu par le prof Sinon j’utilise les interruptions plutot que les call parce ‘normalement’ le projet est à rendre pour TASM sous DOS donc avec des interruptions, je veux éviter des appels à des librairies externes. En tout cas, si j’ai d’autre problème, je ne vous oublie pas.

Voila, j’ai encore un problème, mon projet consiste à encoder un
fichier, pour l’algo, pas de problème, à la limite je pompe sur les
autres mais pour tout ce qui est fonction de base, je galère car comme
j’ai dis, je suis le seul qui le fait sous linux.

La je galère à avec la fonction’ int sys_open(const char * filename, int flags, int mode)’

Voici le code source.
Mon programme est censé saisir une adresse au clavier et ouvrir le
fichier mais à chaque fois il me provoque une erreur car il n’arrive
pas à ouvrir le fichier. Si quelqu’un pourrait me débloquer…
Ce message a été édité par ZGoblin le 12/01/2004

Question conne: sys_open renvoie un entier. Donc, quand ca marche, ca renvoie 0, nan? Y’a juste un probleme dans ton test pour moi…

[quote]Question
conne: sys_open renvoie un entier. Donc, quand ca marche, ca renvoie 0,
nan? Y’a juste un probleme dans ton test pour moi…[/quote]non pas du tout, open renvoie le file descriptor du fichier à ouvrir. 0 correspond à l’entrée standart. en cas d’erreur, il renvoie un nombre négatif.