我覺得所謂的模塊化有兩種: "假模塊化" 和 "真模塊化".
所謂 "假模塊化" 就是通過 include 指令把 *.inc 或 *.asm 文件的文本插入到當前位置.
這樣最後還是一個大的 asm 文件, 這適合小型的模塊化設計.
所謂 "真模塊化" 就是一個或幾個源文件先通過 lib.exe 編譯成 *.lib 文件, 然後通過 includelib 指令引入使用.
這在 RadASM 環境中可通過建立 LIB Project 工程方便做到. 做大工程應該使用這種方式.
假如通過 Win32 App (no res) 模板建立了並實現了這樣一個工程(Test33):
; Test33.asm
.386
.model flat, stdcall
include Windows.inc
include kernel32.inc
include masm32.inc
include debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
.code
;兩數求和的函數
sum2 proc v1, v2
mov eax, v1
add eax, v2
ret
sum2 endp
;三數求和的函數
sum3 proc v1, v2, v3
mov eax, v1
add eax, v2
add eax, v3
ret
sum3 endp
;
main proc
invoke sum2, 11, 22
PrintDec eax ;33
invoke sum3, 11, 22, 33
PrintDec eax ;66
ret
main endp
end main
上面程序的 "假模塊化" 的實現:
通過: 工程窗口 -> 右鍵 -> 新建 -> 源文件, 分別建立 num2.asm 和 num3.asm
現在要把整個程序分散一些分別到: Test33.inc、num2.asm、num3.asm
;Test33.inc
.386
.model flat, stdcall
include Windows.inc
include kernel32.inc
include masm32.inc
include debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
;num2.asm
.code ;這個 .code 可有可無
;兩數求和的函數
sum2 proc v1, v2
mov eax, v1
add eax, v2
ret
sum2 endp
;num3.asm
;三數求和的函數
sum3 proc v1, v2, v3
mov eax, v1
add eax, v2
add eax, v3
ret
sum3 endp
;Test33.asm ;這樣主程序的代碼就非常簡單了
include Test33.Inc
.code
include sum2.asm
include sum3.asm
;
main proc
invoke sum2, 11, 22
PrintDec eax ;33
invoke sum3, 11, 22, 33
PrintDec eax ;66
ret
main endp
end main
上面程序的 "真模塊化" 的實現:
准備把 num2 和 num3 兩個函數分別作在兩個模塊裡(其實一個模塊可以包含很多東西).
文件 -> 新建工程(LIB Project) -> 隨意取名為 sum2(准備實現 sum2 函數) -> 然後默認下去, 代碼如下:
; sum2.asm
.386
.model flat, stdcall
.code
sum2 proc v1, v2
mov eax, v1
add eax, v2
ret
sum2 endp
end ;注意這裡只有 end, 模塊等待調用, 不能指定入口函數
;然後執行構建(Alt+Shift+F5), 我們需要的 sum2.lib 已經在剛才建立的工程目錄下了
;同樣可以建立並得到 sum3.lib
; sum3.asm
.386
.model flat, stdcall
.code
sum3 proc v1, v2, v3
mov eax, v1
add eax, v2
add eax, v3
ret
sum3 endp
end
;調用庫測試:
;Test33_2.asm
.386
.model flat, stdcall
include Windows.inc
include kernel32.inc
include masm32.inc
include debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
;這裡的引入路徑可以是全路徑, 這裡是相對路徑
includelib ..\sum2\sum2.lib
includelib ..\sum3\sum3.lib
;子程序聲明
sum2 proto :dword, :dWord
sum3 proto :dword, :dword, :dWord
.code
main proc
invoke sum2, 11, 22
PrintDec eax ;33
invoke sum3, 11, 22, 33
PrintDec eax ;66
ret
main endp
end main
;假如把
sum2 proto :dword, :dWord
sum3 proto :dword, :dword, :dWord
;分別寫在 sum2.inc 和 sum3.inc, 程序可改為:
; Test33_3.asm
.386
.model flat, stdcall
include Windows.inc
include kernel32.inc
include masm32.inc
include debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
include ..\sum2\sum2.Inc
include ..\sum3\sum3.Inc
includelib ..\sum2\sum2.lib
includelib ..\sum3\sum3.lib
.code
main proc
invoke sum2, 11, 22
PrintDec eax ;33
invoke sum3, 11, 22, 33
PrintDec eax ;66
ret
main endp
end main
;其實把子程序的聲明直接寫在實現它的 asm 文件裡也行, 但那樣層次不分明.