【发布时间】:2016-05-16 20:56:07
【问题描述】:
- 对不起我的英语。
- 感谢您的每一个回答。
我在 C 和内联汇编中有以下代码应该调用函数:int gettimeofday(struct timeval *tp, struct timezone *tzp);
val = (struct timeval*)malloc(sizeof(struct timeval));
zone = (struct timezone*)malloc(sizeof(struct timezone));
__asm__("push $0;"
"push %2;"
"push %1;"
"movl $116, %%eax;"
"int $0x80;"
:"=r"(val)
:"r"(val),"r"(zone)
:"%eax");
问题是,我不知道为什么我需要这条线"push $0;",而我的老师说,我的论点顺序不正确,只是运气好而已。
我应该如何更改此代码以使其正确?如果它在某种程度上是正确的,为什么会有"push $0;"?
【问题讨论】:
-
鉴于上下文,这些
mallocs 是不必要的。这些结构也可以是局部变量。 -
你是对的,我的错。
-
我自己从来没有做过任何 FreeBSD 低级编程,但是 according to this,你的参数的顺序很好(例如
tzone被先推送,然后tvalue),但是你'在中断调用之前应该有另一个双字推送,其内容无关紧要。 -
我试图将推送作为最后一个参数,但它对 tvalue 没有任何作用
-
FreeBSD 有一个
int $0x80系统调用的软件陷阱吗?这是 Linux 的东西,是的,但它也是 FreeBSD 的东西吗?
标签: c freebsd inline-assembly