FASM给我'错误:非法指令。'在组装期间

时间:2015-11-30 19:30:56

标签: linux assembly x86 fasm

我刚开始编写汇编代码。我已经从互联网上下载了flat assembler和复制的代码。但是,当我运行此代码时,它会显示如下内容:

section .text 
error: illegal instruction.

我的问题是:这段代码出了什么问题?

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

有人可以弄清楚出了什么问题吗?

4 个答案:

答案 0 :(得分:3)

第二行缺少空间

section .text
    global _start

请参阅here

答案 1 :(得分:3)

使用引号标记section '.text'并且没有global afaik,而是使用public _start。 FASM可以为您构建可执行的ELF,format ELF64 executable作为第一行。现在,如果您不想将其与其他对象文件链接,则可以使用segment executableentry _start

答案 2 :(得分:1)

问题是您使用的是 FASM ,但您从互联网上获取的代码是 NASM 。如果您要在Linux发行版中安装NASM,那么如果您使用 NASM 并修复此行中的错误,则代码应该可以正常运行:

global_start     ;must be declared for linker (ld)

应该是:

global _start     ;must be declared for linker (ld)

global指令在标签 _start

之前需要一个空格

如果您希望使用 FASM ,我建议您查找一些特定于该汇编程序的示例和教程。如果你要在装配方面做任何重大的开发,我会推荐 NASM 或GNU汇编程序(gas)。

答案 3 :(得分:0)

我建议使用

section '.text'

例如, 您可以这样使用代码:

section '.text' code readable executable

OR

section '.idata'

在节后定义时要小心使用''。