Assembleur: "Erreur de segmentation"

zatox Messages postés 663 Statut Membre -  
zatox Messages postés 663 Statut Membre -
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.

A voir également:

3 réponses

jisisv Messages postés 3678 Statut Modérateur 935
 
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)
1
zatox Messages postés 663 Statut Membre 66
 
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 3678 Statut Modérateur 935
 
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 3678 Statut Modérateur 935
 
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 663 Statut Membre 66
 
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