【发布时间】:2018-04-13 05:07:55
【问题描述】:
我发现了许多使用 asm 运行 Hello World 系统调用的示例,但没有一个涉及使用返回值调用系统调用。我的代码是
int my_syscall(int sn)
{
int output_variable = 0;
int input_variable = sn;
__asm__ volatile(
"mov r7,%1\n\t"
"svc 0\n\t"
"mov %0,r0\n\t"
:"=r"(output_variable)
:"r"(input_variable)
);
return output_variable;
}
在 ARM linux(BeagleBone Black) 上运行它会给我一个分段错误。
【问题讨论】:
-
应该是哪个系统调用?通过
strace运行它。此外,您在不告诉编译器的情况下(至少)破坏r0和r7。如果您需要特定寄存器中的内容,请使用寄存器变量,而不是mov指令。 -
正如 Jester 所说,使用
register int retval asm("r0")来控制哪个寄存器"=r"为没有特定寄存器约束的机器选择is a supported use ofasmregister variables。你的 asm 中不需要任何mov指令,应该尽量避免它们。 -
你有没有先尝试真正的组装?从那里开始工作,然后如果绝对必要,然后使用内联
-
Start as thumb, klibc common and shims, static library arm cross compile...
write()的一个工作示例在最后一个链接中,您可以使用它来制作粗略的“打印”工具。write("Hello World")返回一个值。
标签: linux linux-kernel arm system-calls inline-assembly