2014-01-26 47 views
0
section .text 
    global start 

start: 
    mov eax, 29 
    int 80h 
    ret 

呼吁暂停时,我敢肯定,pause(void)是系统调用29,所以这是为什么给我Bus error: 10总线错误在OSX

回答

2

根据sys/syscall.h

#define SYS_recvfrom  29 

我猜recvfrom需要一些其他的参数,让您的总线错误。


如果你实际上是试图调用pause(void),源的粗略研究似乎表明,这些定义是类似以下内容:

syscalls.h

#define SYS_sigsuspend  111 

sigsuspend.c

int 
sigsuspend (
      const sigset_t *sigmask_p 
) 
{ 
    sigset_t mask; 

    if (sigmask_p) 
     mask = *sigmask_p; 
    else 
     sigemptyset(&mask); 
    return syscall (SYS_sigsuspend, mask); 
} 

sigcompat.c

int sigpause(mask) 
    int mask; 
{ 
    return (sigsuspend((sigset_t *)&mask)); 
} 

sigpause.c

int 
pause() 
{ 
    return sigpause(sigblock(0L)); 
} 

所以,虽然pause(void)可以不带任何参数,系统调用肯定不会。


要调用pause(void)从组装,带libc链接:

example.asm:

section .text 
    global start 

start: 
    call pause 
    ret 

编译as -o example.o example.asm和链接与gcc -static -o a.out example.o

+0

所有文档(HTTP:// www.tutorialspoint.com/unix_system_calls/pause.htm)我已经看到虽然说,暂停不会采取任何额外的参数? – sircodesalot

+0

@sircodesalot,暂停不是系统调用,您可以通过中断触发它。这是一个系统调用,它在libc中。此外,您列出的系统调用与我可以找到的OS X版本的'pause'没有任何关系。 – Mitch

+0

'暂停不是系统调用,您可以通过中断触发它。如何在没有中断的情况下触发系统调用?此外,这里列出了“暂停”调用(http://asm.sourceforge.net/syscall.html),前言为:“这些不是libc'系统调用',而是Linux Kernel提供的实际系统调用。”难道OSX实际上不支持这个调用吗? (但为什么它会在C中工作?) – sircodesalot