在Win32環境下匯編,自然難免或必然要用到C標準函數,以下是匯編調用C標準函數的方法。
C標準函數包含在MSVCRT.LIB文件中,此文件在VC中可以找到。把它復制到匯編的庫目錄下,然后包含進去。
includelib masm32/lib/msvcrt.lib
然后還需宣告你將要時用到的函數的原型,用如下語句:
extern
C printf:dword
;或者
printf proto c:dword,:vararg
;或者
printf proto c:dword,:vararg
第一句宣告了printf函數有一個DWORD類型的參數;第二種方法是宣告printf函數有不確定個dword類型的參數,這是printf函
數的特點。
然后就可以壓棧再call它了,甚至invoke。
下面給個例子:
.386
.model flat, stdcall
option casemap :none
include C:/masm32/include/windows.inc
.model flat, stdcall
option casemap :none
include C:/masm32/include/windows.inc
include C:/masm32/include/kernel32.inc
includelib C:/masm32/lib/kernel32.lib
includelib C:/masm32/lib/kernel32.lib
include c:/masm32/include/user32.inc
includelib c:/masm32/lib/user32.lib
includelib c:/masm32/lib/user32.lib
includelib c:/masm32/lib/msvcrt.lib
;宣告printf之原型
printf proto c:dword,:vararg
;extern C printf:DWORD
;extern C printf:DWORD
.data
szCaption db 'hello', 0
szText db 'hello!', 0
szText db 'hello!', 0
.code
start:
invoke MessageBox, NULL, offset szText, offset szCaption, MB_OK
//使用之
invoke printf, offset szText
invoke ExitProcess, NULL
end start
編譯連接,運行,咦?怎么控制臺上沒有打印出Hello!字樣?那是當然,前后環境都沒設定單單調用個printf當然是什麼都不會有。