ASM: `mov' 的内存引用过多

ASM: too many memory references for `mov'

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

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

我收到一个我真的不知道如何修复的错误:

Error: too many memory references for `mov'

如果您使用 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