的x86維基(我剛剛更新再次:)已鏈接到系統調用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
符號定義時,這可能會或可能不起作用。
下次嘗試使用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
@Michael謝謝,但我已經知道這些網站,他們實際上並沒有告訴我,我必須在ecx中爲syscall打開哪些「int flags」,或者必須是char *常量文件名...我顯然搜索了谷歌,但我無法找到我正在尋找什麼。這就是我在這裏問的原因。 docs.cs.up.ac.za網站有一個鏈接源,但當我點擊它時,它什麼都不做(在Linux上) – pippo
_「他們實際上並沒有告訴我哪個」int flags「我必須在ecx中爲syscall設置打開「_ google」man sys_open「。_「或如何必須是char * const文件名」_我不理解評論。 'const char *'只是NUL終止字符串的地址。 – Michael