错误的指令 - C 代码中的内联汇编语言
Bad Instruction - Inline Assembly Language in C Code
我试图退出一个带有汇编指令的程序,但是当我用gcc编译时它说mov
是一个错误的指令,即使我使用 movl
我什至不知道它是什么。甚至可以使用汇编指令退出程序吗?
int main(void)
{
__asm__("movl %rax, \n\t"
"movl %rdi, [=10=]\n\t"
"syscall\n");
}
// cc main.c -o main && ./main
64 位需要 movq
。另外,您的操作顺序不正确。
编译如下:
int main(void)
{
__asm__("movq , %rax\n\t"
"movq [=10=], %rdi\n\t"
"syscall\n");
}
请注意,对于任何其他系统调用(不会终止整个程序),有必要告诉编译器哪些寄存器被破坏,并且通常使用 "memory"
破坏来确保内存是在系统调用读取或写入内存之前与 C 值同步。
此外,要传递操作数,您需要扩展 asm 语法。有关 my_write
包装器的示例,请参阅 How to invoke a system call via sysenter in inline assembly?。 (在 asm 模板中只有 "syscall"
;我们要求编译器将调用号和参数放在正确的寄存器中,而不是写入 mov
)
我试图退出一个带有汇编指令的程序,但是当我用gcc编译时它说mov
是一个错误的指令,即使我使用 movl
我什至不知道它是什么。甚至可以使用汇编指令退出程序吗?
int main(void)
{
__asm__("movl %rax, \n\t"
"movl %rdi, [=10=]\n\t"
"syscall\n");
}
// cc main.c -o main && ./main
64 位需要 movq
。另外,您的操作顺序不正确。
编译如下:
int main(void)
{
__asm__("movq , %rax\n\t"
"movq [=10=], %rdi\n\t"
"syscall\n");
}
请注意,对于任何其他系统调用(不会终止整个程序),有必要告诉编译器哪些寄存器被破坏,并且通常使用 "memory"
破坏来确保内存是在系统调用读取或写入内存之前与 C 值同步。
此外,要传递操作数,您需要扩展 asm 语法。有关 my_write
包装器的示例,请参阅 How to invoke a system call via sysenter in inline assembly?。 (在 asm 模板中只有 "syscall"
;我们要求编译器将调用号和参数放在正确的寄存器中,而不是写入 mov
)