【问题标题】:gettimeofday in inline assembly FreeBSD内联汇编 FreeBSD 中的 gettimeofday
【发布时间】:2016-05-16 20:56:07
【问题描述】:
  1. 对不起我的英语。
  2. 感谢您的每一个回答。

我在 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


【解决方案1】:

所以,感谢 Daniel Kamil Kozar,我发现了删除 malloc-s 的问题。我的老师对订单有点正确,但它也在 malloc-s 中。 Malloc 只是用“垃圾”给内存,所以 calloc 就可以了。我将区域设置为零值,我可以将 push $0; 移动到其他 2 下。

【讨论】:

    猜你喜欢
    • 2020-08-28
    • 2012-10-20
    • 2013-11-26
    • 2014-07-19
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多