【问题标题】:ASM: too many memory references for `mov'ASM:“mov”的内存引用过多
【发布时间】:2019-07-25 00:09:52
【问题描述】:
又是我,我的 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
assembly
x86
osdev
intel-syntax
【解决方案1】:
如果您使用 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