我需要在x86彙編代碼中針對Windows平臺進行系統調用(系統調用)。如何在Windows的x86程序集中編寫系統調用?
在Linux上,我只想做類似int 0x80
的操作,但這在Windows上不起作用。代碼看起來應該在Windows上執行系統調用?
(我使用的AT & T語法和寫作64位代碼,如果它的問題,但答案應該是英特爾的語法和32位代碼相同。)
我需要在x86彙編代碼中針對Windows平臺進行系統調用(系統調用)。如何在Windows的x86程序集中編寫系統調用?
在Linux上,我只想做類似int 0x80
的操作,但這在Windows上不起作用。代碼看起來應該在Windows上執行系統調用?
(我使用的AT & T語法和寫作64位代碼,如果它的問題,但答案應該是英特爾的語法和32位代碼相同。)
窗口不允許你像使用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
*「在Windows上拼裝很不合適」*這是什麼意思? –
您將要調用WinAPI的函數的調用,而不是讓系統直接調用。 –
我發現很難相信我們還沒有一個,但我一直無法找到這個問題的重複目標。它經常被問到,所以也許我們應該考慮把這個問題變成一個典型的問題?任何對x86標籤有更深入瞭解的人都知道我錯過了一個?我確實發現[這一個](http://stackoverflow.com/questions/2489889)和[這一個](http://stackoverflow.com/questions/21074334),但他們太過集中在NT本地(無證)API,這與將* NIX系統調用轉換爲Windows的基本問題無關。 –
順便說一句,對於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中查找) –