2012-10-06 75 views
0

我試圖用內聯彙編程序(gcc 4.2.1,Mac OS 10.7.5)調用系統調用write代碼編譯成功,但沒有根本沒有任何產出。這是完整的代碼:未能用gcc內聯彙編程序調用系統調用(64位)

int main() 
{ 
    char s[] = "Test\n"; 
    // write(1, s, 5); 
    asm(
     "movq $1, %%rax;" 
     "movq $1, %%rdi;" 
     "movq %0, %%rsi;" 
     "movq $5, %%rdx;" 
     "syscall;" 
     : 
     : "r"(s) 
     : "%rax", "%rdi", "%rsi", "%rdx" 
    ); 
} 

編譯用gcc:

$ gcc main.c -o test 

運行:

$ ./test 

通過與Xcode的4.5調試器中運行的代碼,我得到這個錯誤:

Thread 1: EXC_SYSCALL (code=1, subcode=0x1) 

代碼有什麼問題?它使用Ubuntu 12.04 LTS成功運行。

謝謝!

+2

系統調用在Linux和Mac OS X上不一定具有相同的數字。通過簡單的Google訪問,您可以找到許多信息。這裏有一個鏈接描述了將一個簡單的程序從Linux轉換到Mac OS X:http://thexploit.com/secdev/mac-os-x-64-bit-assembly-system-calls/ –

回答

2

正如我在上面的評論中提到的,系統調用號碼是不同的。你需要把0x2000004%rax得到這個程序在Mac OS X上運行

我真的不知道你的程序是如何工作的在Ubuntu上,或者說,因爲你正在使用你的榜樣的exit系統調用號1 ,而不是4write

+0

32位和64位Linux不一樣。看看這裏:http://www.acsu.buffalo.edu/~charngda/linux_syscalls_64bit.html – qwertz