2016-12-04 91 views
1

我需要在x86彙編代碼中針對Windows平臺進行系統調用(系統調用)。如何在Windows的x86程序集中編寫系統調用?

在Linux上,我只想做類似int 0x80的操作,但這在Windows上不起作用。代碼看起來應該在Windows上執行系統調用?

(我使用的AT & T語法和寫作64位代碼,如果它的問題,但答案應該是英特爾的語法和32位代碼相同。)

+1

您將要調用WinAPI的函數的調用,而不是讓系統直接調用。 –

+1

我發現很難相信我們還沒有一個,但我一直無法找到這個問題的重複目標。它經常被問到,所以也許我們應該考慮把這個問題變成一個典型的問題?任何對x86標籤有更深入瞭解的人都知道我錯過了一個?我確實發現[這一個](http://stackoverflow.com/questions/2489889)和[這一個](http://stackoverflow.com/questions/21074334),但他們太過集中在NT本地(無證)API,這與將* NIX系統調用轉換爲Windows的基本問題無關。 –

+1

順便說一句,對於Linux上的64位代碼,您應該通過'syscall'使用64位ABI,而不是通過'int $ 0x80'的32位ABI,因爲它將clobbers r8-r15截斷,將指針截斷爲32-位,並使用任何結構的32位版本。請參閱[x86 tag wiki](http://stackoverflow.com/tags/x86/info)中關於'syscall'的調用約定和系統調用號的鏈接。 (即在unistd_64.h中查找) –

回答

1

窗口不允許你像使用DOS或Linux一樣使用中斷。您需要改爲調用WinAPI或C庫。在32位操作系統上,您可以使用NTVDM,這是DOS應用程序的虛擬機,允許您使用int 21h。請注意,訪問低級別磁盤的程序(使用這些中斷)可以標記爲誤報。這是例如調用窗口的功能,而無需使用interrputs(altrough裝配在Windows上是廢話):

global _main 
    extern _printf 

    section .text 
_main: 
    push message 
    call _printf 
    add  esp, 4 
    ret 
message: 
    db 'Hello, World', 10, 0 
+2

*「在Windows上拼裝很不合適」*這是什麼意思? –

相關問題