【发布时间】:2021-05-20 13:03:10
【问题描述】:
我决定尝试在我的基本操作系统中使用 c 中的内联汇编(使用 intel 语法,因为我习惯使用 NASM)。我遇到了一些我无法解决的问题,我试着到处寻找,但没有任何效果。在尝试错误消息后显示的代码时,GCC 会显示以下消息:
main.c: Assembler messages:
main.c:8: Error: invalid use of register
代码是:
int main(){
asm("mov ah, 0x00\n\t");
asm("mov al, 0x13\n\t");
asm("int 0x10\n\t");
asm("mov bx, 0xA000\n\t");
asm("mov es, bx\n\t");
asm("mov di, 0\n\t");
asm("mov byte [es:di], 0x0f\n\t"); // Problem line of error.
while(1){
asm("nop");
}
return 0;
}
有人可以帮我吗?
【问题讨论】:
-
GCC 是否支持 NASM 风格的 intel 语法?也许试试
mov byte ptr es:[di], 0x0f。我假设你在命令行告诉 GCC 你想使用 intel 语法,因为我在你的代码中没有看到任何.intel_syntax指令。 -
仅供参考,这与使用 GNU C 内联汇编的安全方法相差甚远,即使除了使用 NASM 语法。切勿在非
naked函数中使用基本 Asm(无约束/破坏者)。您必须始终告诉编译器您正在修改哪些寄存器(以及您正在读取/写入的内存,除非您使用"memory"clobber)。另外,这里不需要销毁BX;使用 AX 或 DI 作为临时保存所需的 ES 值。
标签: c gcc x86 inline-assembly intel-syntax