2014-01-26 53 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