程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 學 Win32 匯編[33] - 探討 Win32 匯編的模塊化編程

學 Win32 匯編[33] - 探討 Win32 匯編的模塊化編程

編輯:Delphi

 我覺得所謂的模塊化有兩種: "假模塊化" 和 "真模塊化".

  所謂 "假模塊化" 就是通過 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 文件裡也行, 但那樣層次不分明. 



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved