5

又是我,我的 idt.S 文件中有一个新问题(使用 gcc 编译的 Intel 语法)。当我尝试编译以下代码时:

load_idt:
        mov edx, (esp + 4) ; On this line
        lidt (edx)
        sti
        ret

我收到一个我真的不知道如何解决的错误:

Error: too many memory references for `mov'
4

1 回答 1

8

如果您使用 GCC 进行组装,则使用以下内容:

gcc -c -m32 -masm=intel idt.S -o idt.o

问题是:

  • 您需要将该指令添加.intel_syntax noprefix到文件的顶部。默认情况下,GCC 汇编.s.S文件假设 Intel 语法需要%所有寄存器的前缀。该指令消除了该要求。
  • 在 Intel 语法中,内存操作数使用方括号[]不是括号()
  • 注释以#代替开头;

代码应如下所示:

.intel_syntax noprefix

load_idt:
        mov edx, [esp + 4] # On this line
        lidt [edx]
        sti
        ret
于 2019-03-03T15:46:05.090 回答