Assembleur: "Erreur de segmentation"

Fermé
zatox Messages postés 640 Date d'inscription samedi 17 février 2007 Statut Membre Dernière intervention 26 juin 2020 - 9 févr. 2012 à 01:26
zatox Messages postés 640 Date d'inscription samedi 17 février 2007 Statut Membre Dernière intervention 26 juin 2020 - 22 févr. 2012 à 14:27
Bonjour, je débute en assembleur, je suis sous Linux et j'utilise pour compiler NASM.
Après avoir compilé et linké, à l'exécution j'ai le message: "Erreur de segmentation"
Voici mon code:

section .text
global _start

_start:

mov ax, cs
mov ds, ax

mov esi, msg ; Avec nasm => "mov si, msg"

boucle:
mov al, [esi] ; [ds:si] => al
inc esi ; si = si + 1
cmp al, 0 ; Si AL = 0
je fin ; Alors fin
mov ah, 0eh ; Sinon ecrire le caractère
mov bx, 07h ; en gris sur noir
int 10h
jmp boucle
fin: ret

msg db 'Hello World !!!',0


Si quelqu'un peut me dire pourquoi j'ai ce message, merci pour vos réponses.
Je dois m'absenter quelques jours je reprendrai le fil à mon retour.


3 réponses

jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
9 févr. 2012 à 05:58
A vue de nez, tu dois mettre fin au programme dos avec la fonction 4Ch de l'interruption logicielle 21h.
Regarde ici:http://spike.scu.edu.au/~barry/interrupts.html#ah4c
Tu dois également définir le point d'entrée (je ne sais plus comment on fait cela)
0
zatox Messages postés 640 Date d'inscription samedi 17 février 2007 Statut Membre Dernière intervention 26 juin 2020 65
14 févr. 2012 à 00:17
Bonsoir jisisv merci pour ta réponse, le problème, comme je le dis au début, je ne suis pas sous dos, je travaille sous linux, donc pour l'interruption 21h je ne suis pas certain d'être concerné, mais bon je vais essayer de voir ce que tu me dis, quand au pount d'entrée je crois bien que c'est le _start: non ?!!!
Bon si vous avez des idées merci de me les communiquer.
0
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
14 févr. 2012 à 00:35
L'interruption 10h est liée au BIOS . Elle ne te servira pas plus sous Linux.
Par contre tu pourrais écrire un "hello world" minimal en C et l''assembler (avec gcc -S)
et examiner le code assembleur obtenu
Essaye par exemple d'ouvrir /dev/tty et d'y écrire du texte.
Le linker s'occupe du ménage.
essaye par exemple l'équivalent de
johand@osiris: ~ $ echo Hello > /dev/tty
Hello
en C. Tu auras une comunication de moyen niveau avec la console.
0
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
14 févr. 2012 à 01:29
Essaye quelque chose du genre:
johand@osiris: ~/src/CCM/asm $ cat hellotty.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

const char *MESSAGE = "Hello tty\n";

int main(int argc, char *argv[])
{
  // le file descriptor 0 est stdout    
  write(0, MESSAGE, strlen(MESSAGE));
  return(EXIT_SUCCESS);
}
Compile avec johand@osiris: ~/src/CCM/asm $ gcc -Wall -S -o hellotty.S hellotty.c et examine le code assembleur généré.
0
zatox Messages postés 640 Date d'inscription samedi 17 février 2007 Statut Membre Dernière intervention 26 juin 2020 65
22 févr. 2012 à 14:27
Bonjour jisisv, excuses le retard, mais j'ai dû m'absenter un certain temps.
Merci pour ta réponse, effectivement c'est une bonne façon pour avoir le code assembleur généré.
Dans le même ordre d'idée, il y a peut-être une syntaxe permettant d'obtenir non plus le code assembleur généré mais le code machine ?!!!! est-ce possible ? si oui merci de m'indiquer la syntaxe.
0