2015-11-30 4 views
-2

Je viens de commencer le codage en assemblage. J'ai téléchargé le code flat assembler et copié à partir d'Internet. Quand je cours ce code, cependant, il dit quelque chose comme:FASM me donne 'erreur: instruction illégale.' pendant l'assemblage

section .text 
error: illegal instruction. 

Ma question est: quel est le problème avec ce code?

section .text 
    global_start  ;must be declared for linker (ld) 

_start:    ;tells linker entry point 
    mov edx,len  ;message length 
    mov ecx,msg  ;message to write 
    mov ebx,1  ;file descriptor (stdout) 
    mov eax,4  ;system call number (sys_write) 
    int 0x80  ;call kernel 

    mov eax,1  ;system call number (sys_exit) 
    int 0x80  ;call kernel 

section .data 
msg db 'Hello, world!', 0xa ;our dear string 
len equ $ - msg    ;length of our dear string 

Quelqu'un peut-il comprendre ce qui ne va pas?

+5

'global_start'? peut-être 'global _start', avec un espace, à la place? –

Répondre

0

Le problème est que vous utilisez FASM, mais le code que vous avez reçu de l'Internet est pour MSNA . Si vous deviez installer NASM dans votre distribution Linux votre code devrait fonctionner si vous utilisez MSNA et vous corriger le bug à cette ligne:

global_start  ;must be declared for linker (ld) 

qui devrait être:

global _start  ;must be declared for linker (ld) 

La directive mondiale a besoin d'un espace avant que l'étiquette _start

Si vous souhaitez utiliser FASM Je vous recommande de trouver une ex exemples et tutoriel spécifiques à cet assembleur. Je recommanderais NASM ou GNU assembleur (gaz) si vous allez faire un développement important dans l'assemblage.

+0

Merci, j'ai téléchargé un NASM assmebler et ça a marché –

3

Il y a un espace manquant sur la 2ème ligne

section .text 
    global _start 

voir here

1

écrivez section '.text' avec des guillemets et il n'y a pas global afaik, utilisez public _start à la place. FASM pourrait construire des ELF exécutables pour vous avec format ELF64 executable comme première ligne. Maintenant, vous pouvez utiliser segment executable et entry _start si vous ne voulez pas le lier avec d'autres fichiers objets.