2017-01-10 24 views
1

卡盤。使用沒有masm32數據包的符號名稱

我目前正在學習arkane彙編語言藝術。

我寫了顯示一個對話框(在Windows 8.1)的程序。 我檢查了msdn參考並找出如何更改所述對話框的光學和行爲。我還了解了返回值的存儲位置以及如何讀取它。所以我的問題不是那種「幫我卡住」。

看看這個小對話框程序:

.386 
.model   flat, stdcall 
includelib  "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\user32.lib" 
includelib  "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\kernel32.lib" 

MessageBoxA  PROTO :DWord, :DWord, :DWord, :DWord 
ExitProcess  PROTO :DWord 

.data 
Caption   db "Masm shizzle",0 
Text   db "Click OK my friend",0 

.code 
start: 
       push 11h 
       push OFFSET Caption 
       push OFFSET Text 
       push 0 
       call MessageBoxA 

       push 0 
       call ExitProcess 
end start 

這工作就像一個魅力,我想通了如何參數需要在堆棧上進行訂購。
我又試圖提高代碼,並使其更具可讀性和更清潔的,所以我打破了.CODE段到:

.code 
start: 
       invoke MessageBoxA, 0, addr Text, addr Caption, 11h 
       invoke ExitProcess, 0 
end start 

然後我絆了那宣佈你這樣做可能會使代碼更易讀網頁通過在「windows.inc」的幫助下使用符號名稱。 它說那裏我甚至不需要寫functionA(ANSI)。

所以invoke調用是這樣的:

invoke Messagebox, NULL, addr Text, addr Caption, MB_ICONINFORMATION 

的問題是,這些符號名是從MASM32包,從「windows.inc」更具體。
雖然我基本上不反對使用masm32,但我想知道是否在只有Visual Studio安裝的「standart」Windows主機上有相同的文件,我可以使用它。
具體而言,如果我想運行(甚至編譯)上的遠程mashine這個代碼,我不能假設有一個主機上存在的MASM32安裝,所以包括將指向無處迴歸。 (我的理解,或者是打包成可執行文件,如果我預編譯嗎?)

如果這是不可能沒有MASM32,那麼我想我需要寫一個符號名庫....

+0

的'windows.inc'文件只需要在代碼組裝存在,而不是當它運行。如果最終用戶想重新編譯代碼,他們將需要MASM32來完成。 (或者兼容的第三方彙編程序,但是這樣的彙編程序應該提供它自己的include文件版本。)所以我認爲你沒有問題。 –

+0

感謝您爲此帶來了一些清晰的內容。所以我想我只是預編譯我應該需要的所有版本。爲了完善,有沒有一個微軟等同於這個文件? – clockw0rk

+0

其實我沒有意識到MASM32是第三方軟件包。我不知道是否有微軟的等價物,大概不是。根據授權,您可能只需將相關內容直接複製到您的源代碼中即可。 –

回答

1

你可以得到MASM32 package by Hutch from here
這是迄今爲止處理這些問題的最簡單方法。

它也將作爲描述in this thread處理您的ANSI/Unicode的情況。

使用這個包,你會什麼都沒有進一步做,如果你想使用ANSI版本一樣

MessageBoxA PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD 

如果你想使用Unicode版本

MessageBoxW PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD 

你會必須定義

__UNICODE__ EQU true ; or any other way of defining the __UNICODE__ define 

在文件開始處(包含之前)。

這樣做,你可以使用之後 - 在這兩種情況下 - 下面一行

invoke MessageBox, 0, addr Text, addr Caption, 11h