c - 错误指令 - 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
解决方案
你需要movq
64位。此外,您的操作顺序不正确。
以下编译:
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
)
推荐阅读
- php - 使用faker防止laravel工厂中两个外键的重复条目
- json - 离子 3 中位置 1 的 JSON 中的意外标记 o
- rake - Rails API:在控制器外部使用 Pundit - 在 rake 任务中
- sql - 使所有表都成为父 ID 的子表(在 1 列中)
- javascript - 在 WordPress 中如何包含 JavaScript 文件 onClick Button
- c# - 转移班级列表中的多条记录
- visual-c++ - Visual C++ 链接器:定义符号(变量)的顺序或为 .data 定义新部分
- mockito - 如何配置 MyBatisGenerator 生成的 mapper.insertSelective(record) 方法的行为。使用 JUnit4 和 Mockito?
- python - 如何检查熊猫数据框列中的所有值是否相等?
- ios - 如何使用适用于 iOS 的 Xcode 故事板/界面构建器创建和显示部分视图