FASM gives me 'error: illegal instruction.' during assembly

FASM gives me 'error: illegal instruction.' during assembly

我刚开始用汇编编码。我已经下载了 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

有人能找出问题所在吗?

第二行少了一个space

section .text
    global _start

参见 here

问题是您使用的是 FASM,但是您从互联网上获得的代码是 NASM。如果你要安装 NASM 到你的 Linux 发行版中,如果你使用 NASM 并且你在这一行修复了错误,你的代码应该可以工作:

global_start     ;must be declared for linker (ld)

应该是:

global _start     ;must be declared for linker (ld)

全局指令在标签_start

前需要一个space

如果您想使用 FASM,我建议您查找一些特定于该汇编程序的示例和教程。如果您打算在汇编方面进行任何重大开发,我会推荐 NASM 或 GNU 汇编程序(gas)。

用引号写 section '.text' 并且没有 global afaik,请改用 public _start。 FASM 可以用 format ELF64 executable 作为第一行为您构建可执行的 ELF。现在你可以使用 segment executableentry _start 如果你不想 link 它与其他目标文件。

我推荐使用

section '.text'

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

section '.text' code readable executable

section '.idata'

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