我有一些關于 linux-x86_64 和 win64 中的呼叫約定的重??要問題。我搜索了太多地方,但我沒有找到我問題的答案!!!我不認為我的問題是重復的,所以請先閱讀。
在 linux-x86_64 中,我們使用系統呼叫...
linux-x86_64 系統呼叫呼叫約定是:
RDI -> first parameter
RSI -> second parameter
RDX -> third parameter
R10 -> fourth parameter
R8 -> fifth parameter
R9 -> sixth parameter
R11 -> ... (for all syscalls)
RCX -> ... (for all syscalls)
RAX -> return
現在,我關于 linux-x86_64 的問題:
問題 1:如果一個系統呼叫(例如,' sys_write')接受 3 個引數 ( RDI,RSI,RDX),那么其他引數暫存器呢?是的,這個系統呼叫只有 3 個引數,但它也會使用其他引數暫存器(用于其他用途,如內部行程和...)?我的意思是,如果我打電話sys_write并且我有一些東西在R10暫存器中,那么在R10系統呼叫之后值會保持 100% 不變嗎?這個系統呼叫沒有第四個引數,所以我認為 R10 或 R8 或 R9 中的所有內容都將保持不變......對嗎?我對嗎 ?
問題 2:例如,sys_mkdir...如果我必須呼叫sys_mkdir3 次(一個接一個),這種方式是否正確?
mov eax, 83
mov rdi, .filename
mov esi, 0766o
syscall
mov eax, 83
mov rdi, .filename2
syscall ; no (mov esi, 0766o) anymore because ESI is equal to 0766o from last syscall
mov eax, 83
mov rdi, .filename3
syscall ; no (mov esi, 0766o) anymore because ESI is equal to 0766o from last syscall
在這里,我不再更新ESI......因為我認為syscall引數暫存器保持不變。我對嗎?
現在Win64,Win64呼叫約定是:
RCX -> first parameter
RDX -> second parameter
R8 -> third parameter
R9 -> fourth parameter
... (Stack)
問題1:這里,我關于win64呼叫約定的問題與關于linux-x86_64的第一個問題相同。例如,如果我呼叫只有 1 個引數的 Some 函式,(例如ExitProcess)...其他引數暫存器的值會保持不變嗎?或者 windows 也會使用其他引數暫存器,我在它們里面的值會改變嗎?
uj5u.com熱心網友回復:
在我看過的任何 ISA 的任何呼叫約定中,暫存器作為呼叫保留或呼叫破壞的狀態從不取決于呼叫者實際傳遞和/或被呼叫者期望的引數數量,當然不是任何x86 上的標準版本。
但是是的,原始系統呼叫的呼叫約定與函式的呼叫約定不同,即使對于可能是瘦包裝器函式也是如此。
所有標準的用戶空間函式呼叫約定都將所有 arg 傳遞暫存器(和堆疊槽)作為呼叫破壞。因此,如果您的 asm 使用call,這就是您所期望的。
主流作業系統上的系統呼叫約定保留所有暫存器(回傳值除外)。(但在 x86-64 上,只有在syscall其自身覆寫 RCX 和 R11 之后,因為那是在內核獲得控制權之前發生的。)如果您直接使用syscall或int 0x80或其他任何東西,這就是您應該期望的。
請注意,Windows并不會有一個穩定的系統呼叫ABI跨內核版本,不記錄的原始系統呼叫,所以在正常的Windows代碼你總是讓DLL函式呼叫,從來沒有生系統呼叫。 不過,人們已經對不同 Windows 版本的系統呼叫進行了逆向工程。
MacOS 也沒有正式的穩定/檔案化的系統呼叫 ABI,但實際上 Darwin 基本上有,至少對于玩具程式使用的正常 POSIX 打開/讀/寫/關閉/退出呼叫。
- 通過 linux x86-64 函式呼叫保留了哪些暫存器
- i386 和 x86-64 上的 UNIX 和 Linux 系統呼叫(和用戶空間函式)的呼叫約定是什么
- https://packagecloud.io/blog/the-definitive-guide-to-linux-system-calls/
- x86-64 System V ABI 記錄在哪里?
- Windows 系統呼叫
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/313725.html
上一篇:在匯編中,如何處理記錄為小于本機暫存器寬度的回傳值的WindowsAPI?
下一篇:裝配中的標簽和變數?
