使用GCC编译时出现汇编错误

4

当我用这个命令编译.s文件时,会出现“没有这样的指令”错误:

$ gcc -s -o scall scall.s
scall.s: Assembler messages:
scall.s:2: Error: no such instruction: `section '
scall.s:4: Error: no such instruction: `global _start'
scall.s:7: Error: unsupported instruction `mov'
scall.s:8: Error: unsupported instruction `mov'
scall.s:11: Error: operand size mismatch for `int'
scall.s:13: Error: no such instruction: `section .data'
scall.s:15: Error: no such instruction: `msglength .word 12'

以下是文件代码:

section .text
    global _start

_start:
    mov 4,%eax
    mov 1,%ebx
    mov $message,%ecx
    mov $msglength,%edx
    int  $0x80

section .data
   message: .ascii "Hello world!"
   msglength .word 12

我该如何消除错误?

2
为什么要使用 gcc 来编译它? gcc 是一个 C 编译器,应该使用 as 或类似的工具。 - myaut
这是我们现在与学校一起使用的。 - nelthas
“unsupported instruction 'mov'” 没有意义。从绝对地址的 mov 是一个有效的指令,应该可以汇编,只是这不是你想要的指令。最近的 gcc / binutils 只会抱怨实际的错误(section 和 global,以及 msglength 后面缺少 :)。 - Peter Cordes
2个回答

5

我认为以下代码可以编译("gcc"可以编译.s和.S文件,并默认使用C库进行链接,但"as"同样也可以完成这个工作,但不会将代码与C库链接)。

.section .text
    .global _start
_start:
    mov $4,%eax
    mov $1,%ebx
    mov $message,%ecx
    mov msglength,%edx
    int  $0x80

    mov $1, %eax
    mov $0, %ebx
    int $0x80
.section .data
    message: .ascii "Hello world!"
    msglength: .word 12

gcc:

.section .text
    .global main
main:
    mov $4,%eax
    mov $1,%ebx
    mov $message,%ecx
    mov msglength,%edx
    int  $0x80

    mov $1, %eax
    mov $0, %ebx
    int $0x80
.section .data
    message: .ascii "Hello world!"
    msglength: .word 12

谢谢,这就解决了。但是现在当我运行它时,我得到了“分段错误(core dumped)”的提示。我指向了不存在的东西吗? - nelthas
我认为你必须将以下行“mov $msglength, %edx”更正为“mov msglength,%edx”。 - Parham Alvani
不,我仍然遇到相同的错误。也许我应该为此新建一个线程,否则版主会生气的。 - nelthas
在完成后,您必须调用退出系统调用(eax = 1)。我已经为您纠正了上述代码。 - Parham Alvani
是的,AT&T语法要求在需要其地址的数字和变量前面加上$符号。您必须从每个汇编程序中退出。 - Parham Alvani
显示剩余5条评论

-1
将以下内容翻译成中文。内容与编程有关,仅返回翻译后的文本:

请按如下方式进行更正,并使用-c参数编译:gcc -c test.s -o test

.text

_start:
.global main

main: 
    mov 4,%eax
    mov 1,%ebx
    mov $message,%ecx
    mov $msglength,%edx
    int  $0x80

.data
   message: .ascii "Hello world!"
   msglength: .word 12

3
“-c”选项的正确扩展名是“.o”。这里只是汇编而没有链接。您没有修复汇编中的任何错误,并将OP的“_start”更改为“main”:使用“gcc -m32 -nostdlib -static test.s -o test”来汇编和链接一个32位静态可执行文件。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接