Assembleur: "Erreur de segmentation"

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

  1. 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
    1. 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
      1. Modérateur
        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
      2. Modérateur
        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