2016-02-03 221 views
2

我在彙編中遇到了關於linux x86系統調用的問題。nasm系統調用Linux

當我在linux上用nasm創建一個新的彙編程序時,我想知道我必須使用哪些系統調用來完成特定任務(例如讀取文件,寫入輸出或簡單退出.. )。我知道一些系統調用,因爲我已經閱讀了一些關於互聯網的例子(例如eax = 0,ebx = 1 int 0x80退出,返回值爲1),但沒有更多...我怎麼知道是否有其他退出系統調用的參數?或者爲另一個系統調用?我正在尋找一個解釋哪些系統調用有哪些參數在哪些寄存器中傳遞的文檔。

我讀過關於退出函數等的手冊頁,但它沒有向我解釋我在問什麼。

希望我很清楚,

謝謝!

+2

下次嘗試使用google:http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html http://blog.rchapman.org/post/36801038863/linux-system- call-table-for-x86-64 – Michael

+0

@Michael謝謝,但我已經知道這些網站,他們實際上並沒有告訴我,我必須在ecx中爲syscall打開哪些「int flags」,或者必須是char *常量文件名...我顯然搜索了谷歌,但我無法找到我正在尋找什麼。這就是我在這裏問的原因。 docs.cs.up.ac.za網站有一個鏈接源,但當我點擊它時,它什麼都不做(在Linux上) – pippo

+2

_「他們實際上並沒有告訴我哪個」int flags「我必須在ecx中爲syscall設置打開「_ google」man sys_open「。_「或如何必須是char * const文件名」_我不理解評論。 'const char *'只是NUL終止字符串的地址。 – Michael

回答

1

維基(我剛剛更新再次:)已鏈接到系統調用ABI(什麼數字是每一個電話,放在哪裏參數,可以運行什麼指令,以及哪些寄存器會在返回時崩潰)。這在手冊頁中沒有記錄,因爲它是特定於體系結構的。二進制常量也是如此:它們不必在每個架構上都相同。

grep對於O_APPEND/usr/include爲您的目標架構。

更好的是設置一些東西,以便您可以在asm源代碼中使用符號常量,以提高可讀性並避免錯誤風險。

當處理.S文件時,gcc實際上確實使用了C預處理器,但包括大多數C頭文件也會爲您提供一些C原型。

或將#define s轉換爲sed或其他東西的NASM宏。也許

printf '#include <%s>\n' unistd.h sys/stat.h | 
gcc -dD -E - | 
sed -ne 's/^#define \([A-Za-z_0-9]*\) \(.\)/\1\tequ \2/p' 

,每一個非空#define變成NASM symbol equ value。當我試圖在其上運行NASM時,生成的文件有很多行error: expression syntax error,但是從中手動選擇一些有效的行可能會起作用。

某些常數在多個步驟中定義,例如, #define S_IRGRP (S_IRUSR >> 3)。當轉換爲NASM equ符號定義時,這可能會或可能不起作用。