错误的指令-C代码中的嵌入式汇编语言

恐怖undefined变量un

我正在尝试使用汇编指令退出程序,但是当我使用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
约书亚记

您需要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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章