【问题标题】:Error when using GAS with .intel_syntax将 GAS 与 .intel_syntax 一起使用时出错
【发布时间】:2016-03-16 11:16:06
【问题描述】:

根据一些文档和this answer,可以在 Linux 中使用英特尔语法而不是默认的 AT&T 语法来使用 GAS。

我尝试编译以下简单代码,包含在专用文件file.s中:

.intel_syntax noprefix

section .data

section .text
        global _start

_start:
        mov eax, 1      # some random comments

        mov ebx, 0      

        int 80h         

如果我运行as file.s -o file.o,则会产生以下错误:

is2_exit.s: Assembler messages:
is2_exit.s:3: Error: no such instruction: `section .data'
is2_exit.s:5: Error: no such instruction: `section .text'
is2_exit.s:6: Error: no such instruction: `global _start'
is2_exit.s:13: Error: junk `h' after expression

似乎根本没有考虑.intel_syntax。怎么了?

【问题讨论】:

  • 如果你使用.data.text.global _start0x80怎么样?
  • intel_syntax 不适用于指令,尤其是因为没有单一的 intel 语法。它们在每个汇编器中都不同。
  • @Michael 是的,你是对的!如果你想写答案,我会选择它。
  • @Jester 我不知道。通过更改指令语法,它实际上不会出错。
  • 我会推荐其他东西来进行汇编程序编程。天然气不太适合这个。请改用yasmfasmnasm

标签: linux assembly compiler-errors intel att


【解决方案1】:

您似乎对某些指令使用 NASM 语法以及十六进制文字。您需要更改它们以使用 GNU AS 语法。

您应该使用.section name(带前导点)而不是section name。对于.section .text.section .data,您可以将它们简化为.text.data

同样,global symbol 在 GNU AS 语法中应该是 .global symbol(或 .globl symbol)。


关于十六进制文字,manual 有这样的说法:

十六进制整数是“0x”或“0X”后跟一个或多个从“0123456789abcdefABCDEF”中选择的十六进制数字。

所以80h 应该写成0x80(或0X80)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 2021-12-06
    • 2015-07-15
    • 2016-05-04
    • 2014-02-10
    • 2016-04-03
    • 2012-10-10
    相关资源
    最近更新 更多