首页 > 解决方案 > 错误指令 - C 代码中的内联汇编语言

问题描述

我正在尝试使用汇编指令退出程序,但是当我使用gcc编译时,它说这mov是一个错误的指令,即使我使用movl它我什至不知道它是什么。甚至可以使用汇编指令退出程序吗?

int main(void)
{
    __asm__("movl %rax, $60\n\t"
        "movl %rdi, $0\n\t"
        "syscall\n");
}
// cc main.c -o main && ./main

标签: cassemblygccinline-assemblyatt

解决方案


你需要movq64位。此外,您的操作顺序不正确。

以下编译:

int main(void)
{
    __asm__("movq $60, %rax\n\t"
        "movq $0, %rdi\n\t"
        "syscall\n");
}

请注意,对于任何其他系统调用(不会终止整个程序),有必要告诉编译器哪些寄存器被破坏,并且通常"memory"在系统调用读取之前使用破坏器来确保内存与 C 值同步或写入内存。

此外,要传递操作数,您需要扩展 asm 语法。请参阅如何通过内联汇编中的 sysenter 调用系统调用?例如my_write包装器。(仅"syscall"在 asm 模板内部;我们要求编译器将调用号和 args 放入正确的寄存器中,而不是写入mov


推荐阅读